我有一个定期的活动日历,允许人们注册活动。
我在以下结构中有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与某种类型的左连接这是否可行。从具有动态对应项的重复表中替换任何行以覆盖它,同时保留所有其他事件?我只是不确定如何去做,并且正朝着正确的方向迈出一步。希望我的解释不会太混乱。
答案 0 :(得分:1)
是的,可以做到。通过调用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
请注意,“覆盖”并非完全可能,因为列不同,但是您应该从任一表中选择所需的列,如果没有匹配,它们将为动态事件为空。
答案 1 :(得分:0)
这是一种方法:
SELECT IF(d.id IS NOT NULL,'d','r') AS dynamic_or_recurring
, IF(d.id IS NOT NULL,d.id,r.id) AS id
, IF(d.id IS NOT NULL,d.title,r.title) AS title
, ...
FROM recurring_events r
LEFT
JOIN dynamic_events d
ON d.time = t.time AND DAYOFWEEK(d.date) = r.day_of_week
SELECT列表可以只包含每个表中的列,并且根据返回的指示符,您可以选择所需的列集......
SELECT IF(d.id IS NOT NULL,'d','r') AS dynamic_or_recurring
, d.id AS d_id
, d.date AS d_date
, d.time AS d_time
, ...
, r.id AS r_id
,