gpt4 book ai didi

Mysql左连接,仅当字段is_active = 1时才覆盖行

转载 作者:行者123 更新时间:2023-11-29 06:53:45 25 4
gpt4 key购买 nike

9am 我在之前的帖子中获得了有关查询的帮助,但我有一个新问题。请耐心等待我的解释....

设置,2 个表:cal_events,它保存日历的动态事件和对它们进行一天更新的重复事件。此外,cal_events_recurring 包含重复发生的事件。下面的查询是一个示例,其中包含将由 PHP 传递的虚拟数据。我以 12 月 15 日为基础,因此返回当天的所有事件。重要的部分是重复事件只有在没有匹配的动态对应项时才会返回。如果 cal_eventsis_overwrite = 1 及其 overwrite_id =(上午 9:00 cal_events_recurring 事件的唯一 ID ,然后只返回动态表行。这意味着,“嘿,我是一个每天上午 9:00 发生的事件(示例),但是看,在 12 月 15 日,根据具有我的唯一 ID 的动态表更新了当天的 9:00 重复事件= 到它的 overwrite_id 所以返回那个。”

select * from(
select
ifnull(ce.time, cer.time) as time,
ifnull(ce.title, cer.title) as title,
ce.is_overwrite
from cal_events_recurring cer
left join cal_events ce on ce.overwrite_id = cer.id
where cer.is_daily = 1
or cer.day_index = 6
or cer.day_num = 15
union
select time as time, title, is_overwrite
from cal_events where date = '2012-12-15'
and is_active = 1 and is_overwrite = 0) as e order by time asc

这一切都很好,数据是正确的,问题是 is_active 字段。我将再次以上午 9:00 为例。我为 16 日上午 9:00 创建了一个动态事件,它将覆盖 16 日的重复事件。现在,如果我以后决定要恢复到常规重复事件,我会将匹配的动态事件的 is_active 字段设置为 0。问题是动态事件仍然返回。如果我添加 和 ce.is_active = 0 事件仍然返回。我应该如何编写它,以便在其动态对应项未激活时它仍会返回重复发生的事件?

如果您需要任何其他信息,请告诉我!

编辑*输出:

time      title 
08:00:00 recurring everyday 8am
09:00:00 dynamic 9am update

(9am should be the recurring event because the dynamic is_active = 0)

最佳答案

将该条件放入 ON 子句中:

select * from(
select
ifnull(ce.time, cer.time) as time,
ifnull(ce.title, cer.title) as title,
ce.is_overwrite
from cal_events_recurring cer
left join cal_events ce on ce.overwrite_id = cer.id
and ce.is_overwrite = 1 -- Added this line
where cer.is_daily = 1
or cer.day_index = 6
or cer.day_num = 15
union
select time as time, title, is_overwrite
from cal_events where date = '2012-12-15'
and is_active = 1 and is_overwrite = 0) as e order by time asc
)

将特殊条件放入连接条件意味着您仍然可以获得左连接,但仅限于应该连接的行。

如果将条件放在 where 子句中,就会“破坏”左连接和 ifnull() 的意图,原因如下:

连接的 ON 子句中的条件在进行连接时执行,因此您不想连接的行不会连接,也不会将它们的值放入 ifnull() 函数。

一个常见的误解是连接条件只能是“键相关”,而实际上它们可以是任何东西。


如果您将条件放入 where 子句,它会在连接完成后 执行 - where 子句 filter 结果集,所以为时已晚 - ifnull( ) 已经有了动态表的数据。

关于Mysql左连接,仅当字段is_active = 1时才覆盖行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13978474/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com