php - mysql左外连接排名
问题描述
我正在尝试使用左外连接进行排名
我的 sql 是:
SET @rank=0;
SELECT @rank:=@rank+1 AS rank, h.name, COUNT(v.hId) AS votes
FROM users h LEFT OUTER JOIN users_votes v ON h.id = v.hId GROUP BY h.id
ORDER BY rank ASC
;
正确的做法是像这样返回
rank | name | votes
1 Luck 4
2 Marc 3
3 Santos 2
4 Matheus 0
但它以错误的方式返回:
rank | name | votes
1 Santos 2
2 Marc 3
3 Luck 4
4 Matheus 0
解决方案
在 MySQL 8+ 中,您应该使用row_number()
:
SELECT ROW_NUMBER() OVER (ORDER BY COUNT(*) DESC) as rank,
h.name, COUNT(*) AS votes
FROM users h LEFT OUTER JOIN
users_votes v
ON h.id = v.hId
GROUP BY h.id
ORDER BY rank ASC;
变量在 8+ 中已弃用。
在早期版本中,您可以使用变量,但它们往往不尊重ORDER BY
或GROUP BY
。因此,使用这些构造,您需要一个子查询:
SELECT (@rn := @rn + 1) as rank, hv.*
FROM (SELECT h.name, COUNT(*) AS votes
FROM users h LEFT OUTER JOIN
users_votes v
ON h.id = v.hId
GROUP BY h.id
ORDER BY rank ASC
) hv CROSS JOIN
(SELECT @rn := 0) params;
推荐阅读
- javascript - 制表器 - 如何在基于道具从数据库中获取数据时显示加载指示器?
- node.js - 通过从 Node.js 后端检索在 React 前端显示像谷歌驱动器这样的图像
- php - 如何阻止对我的网站的未知呼叫?
- react-native - React Native 漏斗图
- node.js - '在androidjs中没有定义的资源
- apache-spark - 如何实时调整 Spark 作业?
- powershell - 查找每月的第三个星期六
- java - 是否有一种有效的方法来检测字符串是否包含大量特征字符串中的子字符串?
- api - 创建 Demo 版 Web 应用程序的有效方法是什么?
- angular - ThrottleTime 无法正确应用于可观察对象