例如我有很多用户,他们每个人都选择了他们喜欢的游戏,现在在他们推荐的同一个 mysql 行中(竖起大拇指)。 示例数据库:
(nickname): Leonard, (recommends): 999, (game): Mario; (nickname): Nikky, (recommends): 1999, (game): Counter-Strike (nickname): Sam, (recommends): 199, (game): AION
现在我想做的是为每个游戏选择最推荐的用户,而不用做双 mysql 请求,这可能吗?
SELECT * FROM users ORDER BY 推荐DESC
这只是按推荐量排序显示所有这些,但我想要显示每个游戏的推荐最多的 1,因为有很多用户对同一游戏有大量推荐。
最佳答案
编辑:MySQL 5.7
尽管被接受,但在原始响应(见下文)中,建议的 MySQL 5.6 代码不会产生预期的结果,并且从 MySQL 5.7 开始它不可执行。
我推荐这种方法:
SELECT a.*
FROM users a
LEFT JOIN users b
ON a.game = b.game AND a.recommends < b.recommends
WHERE b.recommends IS NULL;
当 a.game
等于 b 时,通过在
和 a
和 b
之间执行 LEFT_JOIN
.gamea.recommends
小于 b.recommends
我们得到一个集合,其中 a.recommends
的值较高与 b.recommends
的空值相关联。像这样:
a.nickname a.recommends a.game b.recommends
---------- ------------ --------- ------------
will 100 mariobros 110
mary 50 cart 80
john 110 mariobros 800
will 100 mariobros 800
martin 80 cart null
viola 800 mariobros null
使用WHERE b.recommends IS NULL
,我们将选择限制在我们感兴趣的行。这样,如果在同一类别中有两个得分相同的昵称,它们都会被选中,这以前的代码不是这种情况。
原答案:
您可以简单地将 GROUP BY
添加到 ORDER BY
之前:
SELECT * FROM users GROUP BY game ORDER BY recommends DESC
关于Php 选择每一种,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35662795/