已经有一段时间了,因为我上次不得不编写SQL。我正在为一个选择而苦苦挣扎,希望您能指出我所缺少的。
我有一个非常简单的表结构,其中包含2个表:
目标是使用开始日期和结束日期显示所有用户的所有估算值。对于没有特定时间范围的估算值的用户,我希望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?
答案 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)
请注意,我还修复了表别名,因此它们不是无意义的字母,而是表名的缩写。