1

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

4

2 回答 2

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

请注意,“覆盖”并非完全可能,因为列不同,但是您应该从任一表中选择您需要的任何列,如果没有匹配,它们将为动态事件为空。

于 2012-12-17T22:52:27.040 回答
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
     , 
于 2012-12-17T22:51:23.887 回答