两个SQL连接,两个不同的结果

时间:2011-03-07 19:10:47

标签: mysql sql

这两个查询是否可能有所不同。我的意思是第一个查询没有包含左表中的所有行,所以我将条件放在连接部分中。

查询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,它应该没有出现在第一个查询中吗?

这是怎么发生的?

4 个答案:

答案 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,结果集中的相应行将被过滤掉。

第二个查询将在所有列上执行正确的外连接。