【问题标题】:Mysql -- how to join 2 tables and only keep matching row if criteria is metMysql - 如何加入 2 个表并仅在满足条件时才保持匹配行
【发布时间】:2012-12-05 02:17:30
【问题描述】:

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

【问题讨论】:

    标签: mysql join replace


    【解决方案1】:

    这是一种方法:

    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
         , 
    

    【讨论】:

      【解决方案2】:

      是的,可以做到。使用左连接调用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
      

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

      【讨论】:

      • 太棒了!我将添加一些虚拟数据并回复您!你也是斯宾塞。
      猜你喜欢
      • 2021-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-13
      • 1970-01-01
      • 2012-12-25
      相关资源
      最近更新 更多