如果未完全填充全局WHERE,则带有JOIN的SQL,其中一个表的列为null

时间:2019-03-09 12:07:20

标签: mysql sql join select left-join

已经有一段时间了,因为我上次不得不编写SQL。我正在为一个选择而苦苦挣扎,希望您能指出我所缺少的。

我有一个非常简单的表结构,其中包含2个表:

  1. 用户
    • user_id
    • 名称
  2. 预估
    • user_id
    • 估计
    • estimation_date

目标是使用开始日期和结束日期显示所有用户的所有估算值。对于没有特定时间范围的估算值的用户,我希望SQL返回一个空值。

实际上,其中涉及更多的表和列以及一些用户角色,但这对于本示例不是必需的。

我试图这样设置我的选择:

SELECT a.id, a.name, b.estimate, b.estimation_date
FROM users a
LEFT OUTER JOIN estimates b on a.id = b.id
WHERE b.estimation_date BETWEEN $startdate AND $enddate OR b.estimation_date IS NULL

只要用户根本没有做出任何估算,结果就是我想要的。每行是一个用户,同一位用户可以多次出现-对于日期范围内的每个估算值一次-且没有估算值的用户在b.estimate和b.estimation_date中为NULL。

但是,一旦用户做出了估算,即使它不在范围内,用户也不会再出现在结果中。

输入开始和结束日期并获得所有用户的最佳解决方案是什么?对于在此范围内没有估计值的每个用户,在这些列中都为NULL?

1 个答案:

答案 0 :(得分:0)

on子句中输入日期范围条件:

SELECT u.id, u.name, e.estimate, e.estimation_date
FROM users u LEFT OUTER JOIN
     estimates e
     ON u.id = e.id AND
        e.estimation_date >= $startdate AND
        (e.estimation_date <= $enddate OR e.estimation_date IS NULL)

请注意,我还修复了表别名,因此它们不是无意义的字母,而是表名的缩写。