繁体   English   中英

MySQL-如何联接2个表,并且仅在满足条件时才保持匹配的行

[英]Mysql — how to join 2 tables and only keep matching row if criteria is met

我有一个定期活动日历,可以让人们注册活动。 我具有以下结构的2个表dynamic_eventsrecurring_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM