在COUNT SQL Query中包含NULL为0

时间:2013-10-25 01:50:29

标签: php html mysql sql ajax

我知道这个事实之前已被问过几次,但是没有一个与此有关的回答问题似乎对我有用或者太混乱了。

我应该解释一下。

我正在尝试创建一个AJAX脚本来运行,以按照“喜欢”的数量对某些结果进行排序。

我目前的代码是:

SELECT COUNT(*) AS total, likes.palette_id, palette.*
FROM likes LEFT JOIN palette ON likes.palette_id = palette.palette_id

GROUP BY likes.palette_id 
ORDER BY total DESC

哪个工作正常,但由于显而易见的原因它没有列出0个喜欢的结果,它们在表中不存在。

我附上了当前表格的图片:

喜欢表: http://imgur.com/EGeR3On

调色板表: http://imgur.com/fKZmSve

在用户点击“赞”之前,表中没有结果。然后,数据库会更新,并插入palette_id和user_id。

我正在尝试计算在likes表中出现* palette_id *的次数,但是对于那些未出现在likes表中的所有调色板也显示0。

这可能吗?如果是这样,有人可以帮助我吗?

谢谢

3 个答案:

答案 0 :(得分:1)

试试这个:

SELECT COUNT(likes.palette_id) AS total, palette.palette_id, palette.*
FROM palette LEFT JOIN likes ON likes.palette_id = palette.palette_id
GROUP BY palette.palette_id 
ORDER BY total DESC

编辑:

关于列出不在GROUP BY中的列的讨论,在MySql documentation page中有一个很好的解释。

  

MySQL扩展了GROUP BY的使用,以便选择列表可以引用   到GROUP BY子句中未命名的非聚合列。这意味着   前面的查询在MySQL中是合法的。您可以使用此功能   通过避免不必要的列排序来获得更好的性能   分组。但是,这主要适用于每个中的所有值   GROUP BY中未命名的非聚合列对于每个列都是相同的   组。服务器可以自由选择每个组中的任何值,所以   除非它们相同,否则所选择的值是不确定的。

在此示例中,未添加到GROUP BY的调色板信息对于每个组都是相同的,因为我们按palette_id进行分组,因此使用调色板不会有任何问题。*

答案 1 :(得分:1)

它可能不是确切的MySQL语法(我习惯使用SQL Server),但如果需要,应该非常直接地进行翻译。

SELECT p.*, IFNULL(l.total, 0) AS total
FROM palette p
LEFT JOIN (
    SELECT palette_id, COUNT(*) AS total
    FROM likes
    GROUP BY palette_id
) l
ON l.palette_id = p.palette_id
ORDER BY total

答案 2 :(得分:0)

您的加入是向后写的。它应该是调色板LEFT JOIN喜欢,因为你想要调色板中的所有行和喜欢的行(如果它们存在)。 “调色板中的所有行”将为您输入一个palette_id,而没有任何匹配的“喜欢”。