0

我知道一个事实,这已经被问过几次了,但是与此相关的已回答问题似乎都不起作用,或者对我来说太混乱了..

我应该解释一下。

我正在尝试创建一个 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

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

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

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

谢谢

4

3 回答 3

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 文档页面中有一个很好的解释。

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

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

于 2013-10-25T02:00:59.860 回答
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
于 2013-10-25T02:01:02.920 回答
0

您的联接是倒写的。它应该是调色板 LEFT JOIN likes,因为您想要调色板中的所有行和喜欢的行(如果它们存在)。“调色板中的所有行”将为您提供没有任何匹配“喜欢”的条目的palette_id。

于 2013-10-25T03:01:20.247 回答