【问题标题】:MySQL - LEFT JOIN failing when WHERE clause addedMySQL - 添加 WHERE 子句时 LEFT JOIN 失败
【发布时间】:2011-01-30 12:03:50
【问题描述】:

我有4张桌子如下; SCHEDULESCHEDULE_OVERRIDESCHEDULE_LOCATION_OVERRIDESLOCATION

我需要从所有表中返回所有行,因此运行此查询可以正常工作,为任何不存在的值添加 NULL 值:

SELECT.....
FROM (schedule s LEFT JOIN schedule_override so ON so.schedule_id = s.id)
LEFT JOIN schedule_location_override slo ON slo.schedule_override_id = so.id
LEFT JOIN location l ON slo.location_id = l.id
ORDER BY s.id, so.id, slo.id, l.id

然后我需要在 schedule_override end_date 字段上限制结果。我的问题是,一旦我这样做,就根本不会返回 SCHEDULE 表的结果。即使不满足覆盖 end_date 条件,我也需要返回所有计划。

这是我正在使用的:

SELECT.....
FROM (schedule s LEFT JOIN schedule_override so ON so.schedule_id = s.id)
LEFT JOIN schedule_location_override slo ON slo.schedule_override_id = so.id
LEFT JOIN location l ON slo.location_id = l.id
WHERE so.end_date > '2011-01-30' OR so.end_date IS NULL
ORDER BY s.id, so.id, slo.id, l.id

欣赏任何想法/cmets。

最好的问候,本。

【问题讨论】:

    标签: mysql left-join join


    【解决方案1】:

    你试过把它放在ON 子句中吗?

    SELECT.....
    FROM (schedule s LEFT JOIN schedule_override so ON so.schedule_id = s.id AND (so.end_date > '2011-01-30' OR so.end_date IS NULL))
    LEFT JOIN schedule_location_override slo ON slo.schedule_override_id = so.id
    LEFT JOIN location l ON slo.location_id = l.id
    ORDER BY s.id, so.id, slo.id, l.id
    

    【讨论】:

    • 是的,做到了!非常感谢,我已经为此苦苦挣扎了一段时间。最好的问候,本。
    • 这仍然很奇怪,因为在 where 子句中也检查了 IS NULL。它应该可以工作,尽管将其移至 ON 会更整洁。
    • @GolezTrol:要应用 WHERE 子句,必须有一个有效的 so-record,因此检查一个字段是否为 NULL 没有任何效果。在 WHERE 中使用基于 so 的字段可以有效地将 JOIN 转换为 INNER JOIN。
    【解决方案2】:

    这是外连接的一个很常见的错误。

    您需要将限制联接的所有内容放入该表的“ON”部分,否则您实际上是将联接转换为内部联接。

    因此,将本例中的 WHERE 子句移至 schedule_override 的 ON 部分,这样就可以了。

    【讨论】:

      【解决方案3】:

      是的,当你离开join时,可能是没有找到一行,结果中该字段为NULL。在 WHERE 子句中添加条件时,该值必须与该条件匹配,如果它为 NULL,则不会匹配。

      这应该不是问题,因为您明确检查 NULL,所以我真的不知道为什么这个条件会失败,除非它确实返回一个日期,但那个日期是 2011 年之前-01-30。

      无论如何,您可以尝试将条件移至联接。它将消除检查 NULL 的需要,尽管它不应该真正产生影响。

      SELECT.....
      FROM 
        schedule s 
        LEFT JOIN schedule_override so 
          ON so.schedule_id = s.id
          AND so.end_date > '2011-01-30'
        ...
      

      【讨论】:

        猜你喜欢
        • 2011-07-06
        • 1970-01-01
        • 2021-02-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多