这两个查询是否可能有所不同。我的意思是第一个查询没有包含左表中的所有行,所以我将条件放在连接部分中。
查询1
SELECT COUNT(*) as opens, hours.hour as point
FROM hours
LEFT OUTER JOIN tracking ON hours.hour = HOUR(FROM_UNIXTIME(tracking.open_date))
WHERE tracking.campaign_id = 83
AND tracking.open_date < 1299538799
AND tracking.open_date > 1299452401
GROUP BY hours.hour
查询2
SELECT COUNT(*) as opens, hours.hour as point
FROM hours
LEFT JOIN tracking ON hours.hour = HOUR(FROM_UNIXTIME(tracking.open_date))
AND tracking.campaign_id = 83
AND tracking.open_date < 1299538799
AND tracking.open_date > 1299452401
GROUP BY hours.hour
区别在于第一个查询给出了18行,其中第17到22点之间没有行。但是当我运行第二个查询时,它显示完整的24行但是对于17到22之间的行,它有一个值 1 !我希望它是0或NULL?如果它真的是1,它应该没有出现在第一个查询中吗?
这是怎么发生的?
答案 0 :(得分:5)
第一个JOIN实际上是一个INNER JOIN,外部连接表不应该出现在WHERE子句中,就像在顶部查询中一样,而不是COUNT(*),从外部连接表中选择一个列
答案 1 :(得分:3)
您正在使用COUNT(*)
,它会计算结果集中的每一行(正如它所写的那样),因为即使没有tracking
中的数据,您也会在hours
中拥有数据。
尝试将COUNT(*)
更改为COUNT(tracking.open_date)
(或tracking
中的任何不可为空的列;无论哪个都无关紧要。)
答案 2 :(得分:1)
COUNT(*)
计算查询中产生的行数。
您可以使用count(tracking.open_date)
,基本上是跟踪表中的任何列(右表)
答案 3 :(得分:0)
问题是第一个查询将执行外连接,其中一些行在跟踪表的所有表中都包含NULL。然后它将对这些跟踪列应用过滤器,因为它们为null,结果集中的相应行将被过滤掉。
第二个查询将在所有列上执行正确的外连接。