2012-12-20 25 views
1

9amI从以前的帖子中查询得到帮助,但我有一个新问题。 忍受我在我的解释....Mysql左连接,只有在字段is_active = 1时覆盖行

设置,2表:cal_events其中包含一个日历的动态事件和有一个更新对他们一天的循环事件。另外,持有重复事件的cal_events_recurring。 下面的查询是一个虚拟数据的例子,它将被PHP传递。 我以12月15日为基础,因此请返回当天的所有活动。 重要的部分是,只有当循环事件没有匹配的动态副本时才会返回循环事件。如果cal_eventsis_overwrite = 1和它的overwrite_id =(上午9点00分cal_events_recurring事件的唯一ID,则只返回动态表格行 这意味着,“嗨,我是每天发生在9: 00AM(例子),但看,在12月15日9:00的周期性活动已更新的基础上有我的唯一的ID的动态表格,天=其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点开始。我创建了一个动态事件,为第16个上午9:00,它将覆盖重复事件十六号如果我稍后决定要恢复到常规循环事件,则将匹配动态事件的is_active字段设置为0。问题是动态事件仍然返回。如果我添加and 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) 
+0

您的预期输出如何? – bonCodigo

+0

我添加了一些输出,你可以看到动态事件被拉动,即使它是is_active字段= 0。它应该拉动循环事件。 – Naterade

+0

尝试一个'内部连接'和(可能)'联合不同'。 – 2012-12-20 19:33:30

回答

2

把这种状态进入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子句过滤结果集,所以这是为时已晚 - 在ifnull()已经具有动态表的数据。

+0

现在似乎很简单,哈哈。谢谢波西米亚! – Naterade

+0

@Naterade np - 我编辑了答案来提供一些解释。 (顺便说一句,我遵循你对上一个问题的另一个问题的评论)。 – Bohemian

+0

是否需要进行日期检查以防止其他日期的一次性事件覆盖指定的周期性事件?是否需要进行is_active检查以防止不活动的每日事件超出主动重复事件? – 2012-12-20 20:02:24