如果没有找到记录,MySQL计数不返回0

时间:2011-07-25 16:32:34

标签: php mysql count record

虽然我研究了这个主题并且遇到了一些解决方案,比如使用JOIN LEFT或子查询,我仍然无法得到我想要的结果,因为我在mySQL中并不强大。我更像是一名网页设计师,试图将更简单的PHP用于我的网站,更好地用于学校项目。

我正在尝试创建类似于博客的Web应用程序。我想计算一个帖子有多少评论,并显示我的用户要查看的数字,但如果该行没有评论,我的查询将不返回任何内容而是0。

这是我的查询:

SELECT post.post_id, COUNT(comment) 
FROM `comment`, post 
WHERE `comment`.post_id = post.post_id 
GROUP BY post.post_id

结果:

Record | post_id | COUNT(comment)
1      | 12      | 2
2      | 13      | 1
3      | 15      | 1
4      | 16      | 1

如您所见,post_id 14没有注释,因此我的查询不返回任何内容。我必须做些什么来使我的结果看起来像这样?

Record | post_id | COUNT(comment)
1      | 12      | 2
2      | 13      | 1
3      | 14      | 0
4      | 15      | 1
5      | 16      | 1

另外,如果我想了解更多关于php的信息,那么你们可以给我参考或链接来理解解决方案背后的概念,这将是很好的。)

2 个答案:

答案 0 :(得分:7)

所以当你这样做时(这就是你所做的,为JOIN重新制定):

SELECT post.post_id, COUNT(comment) 
FROM `comment`
INNER JOIN post ON `comment`.post_id = post.post_id 
GROUP BY post.post_id;

您只收集评论中至少有一个引用的行。

如果您将JOIN类型更改为 LEFT join ,则这样:

SELECT post.post_id, COUNT(comment) 
FROM `comment`
LEFT JOIN post ON `comment`.post_id = post.post_id 
GROUP BY post.post_id;

然后post中的行全部存在,如果没有与此行相关的注释(这是左连接),则为注释列插入NULL值。因此,如果comment是表注释中的一列,它将存在于post表的每一行,但是具有NULL值,在post_id列上的group by之后,与此帖相关的注释子集仅包含1 NULL值,计数应该返回0。

select count(NULL);

返回0.

现在你可以使用子查询,但这是一个非常糟糕的主意,子查询通常是完成而不是LEFT JOINS,通常是一个错误,有时它不是,但它实际上经常是一个错误。当您执行左连接时,索引用于比较2个表的键值(ON子句)并构建一个最终的'临时'行结果,混合来自两个表的值(然后,或者可能在同一时间,应用查询其他部分的过滤器)。当您使用子查询时,对于第一个表的每一行,运行一个新查询以从第二个表中获取结果(并非总是如此,但这是另一个问题),数据库引擎的成本实际上更大。

答案 1 :(得分:1)

查询帖子表,并在评论查询中对计数执行子查询。

SELECT post.post_id, (SELECT COUNT(comment) FROM `comment` WHERE `comment`.post_id = post.post_id) as comments FROM post

对于批次或行,这可能会非常慢,所以当你到达那一点时,请使用寻呼机添加限制。