我有一个周期性事件日历,允许人们注册事件。
我在以下结构中有 2 个表 dynamic_events
和 recurring_events
:
dynamic events
id (int)
date (date)
time (time)
title (varchar[255])
desc (text)
max_attendees (int)
is_overwrite (tinyint[1])
recurring events
id (int)
day_of_week (int)
time (time)
title (varchar[255])
desc (text)
每当重复发生的事件更新时,我都会使其动态化以唯一标识它
attendee
表。它现在的工作方式是查询当天的所有动态事件,然后查询当天的所有重复事件,并将数组传递给 PHP 函数,如果日期和时间匹配,则用动态事件替换任何重复事件并且 is_overwrite
等于 1。基本上意味着该日期和时间的重复事件已更新以允许人们注册。这行得通,但我想知道如果没有带有某种左连接的 PHP,这是否可行。在保留所有其他事件的同时替换具有动态对应项的重复表中的任何行以覆盖它?我只是不确定如何着手,正在寻找朝正确方向迈出的一步。希望我的解释不会太困惑。
最佳答案
是的,这是可以做到的。使用左连接调用 ifnull()
进行覆盖:
select
ifnull(d.time, r.time) as time,
ifnull(d.title, r.title) as title,
ifnull(d.desc, r.desc) as desc
from recurring_events r
left join dynamjc_events d on dayofweek(d.date) = r.day_of_week
and d.time = r.time
请注意,“覆盖”并非完全可行,因为列不同,但是您应该从任一表中选择您需要的任何列,如果没有匹配项,对于动态事件它们将为空。
关于Mysql - 如何连接 2 个表并仅在满足条件时保留匹配行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13923420/