我知道这个事实之前已被问过几次,但是没有一个与此有关的回答问题似乎对我有用或者太混乱了。
我应该解释一下。
我正在尝试创建一个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/fKZmSve
在用户点击“赞”之前,赞表中没有结果。然后,数据库会更新,并插入palette_id和user_id。
我正在尝试计算在likes表中出现* palette_id *的次数,但是对于那些未出现在likes表中的所有调色板也显示0。
这可能吗?如果是这样,有人可以帮助我吗?
谢谢
答案 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,而没有任何匹配的“喜欢”。