[英]Mysql — how to join 2 tables and only keep matching row if criteria is met
我有一个定期活动日历,可以让人们注册活动。 我具有以下结构的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()
调用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
请注意,由于列不同,“覆盖”并不完全可能,但是您应该从任一表中选择所需的任何列,如果没有匹配项,则对于动态事件它们将为null。
这是一种方法:
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
,
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.