Mysql - 如何连接2个表,只有在符合条件时才保持匹配行

时间:2012-12-17 22:38:37

标签: mysql join replace

我有一个定期的活动日历,允许人们注册活动。 我在以下结构中有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与某种类型的左连接这是否可行。从具有动态对应项的重复表中替换任何行以覆盖它,同时保留所有其他事件?我只是不确定如何去做,并且正朝着正确的方向迈出一步。希望我的解释不会太混乱。

2 个答案:

答案 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
     ,