[英]mySQL “Rank in Highscore”-Query
你好世界各地的编码员,
我正在开发一个项目,用户可以做某些事情并获得积分。 为了简化这个问题,假设我们有2个表用户和积分 。
-- table user -- table points
+---------------+ +-----------------------------+
| id | name | | id | points | user_id |
+---------------+ +-----------------------------+
| 1 Tim | | 1 5 1 |
| 2 Tom | | 2 10 1 |
| 3 Marc | | 3 5 1 |
| 4 Tina | | 4 12 2 |
| 5 Lutz | | 5 2 2 |
+---------------+ | 6 7 1 |
| 7 40 3 |
| 8 100 1 |
+-----------------------------+
现在,为了获得完整的高分列表,我使用以下查询
SELECT u.*, SUM( p.points ) AS sum_points
FROM user u
LEFT JOIN points p ON p.user_id = u.id
GROUP BY u.id
ORDER BY sum_points DESC
从头到尾为所有用户创建一个精细的高分列表
+------------------------------+
| id | name | sum_points |
+------------------------------+
| 1 Tim 127 |
| 3 Marc 40 |
| 2 Tom 14 |
| 4 Tina 0 |
| 5 Lutz 0 |
+------------------------------+
好吧回到问题本身。 在单个用户的个人资料中,我想在高分榜中显示他的排名。
这可以使用单个查询来完成,例如Tom(id = 2)排在第3位吗?
非常感谢 :-)
这个想法是问“有多少玩家排在@this_user之上”:
select count(*) + 1 from
(
/* list of all users */
SELECT SUM( p.points ) AS sum_points
FROM user u
LEFT JOIN points p ON p.user_id = u.id
GROUP BY u.id
) x
/* just count the ones with higher sum_points */
where sum_points > (select sum(points) from points where user_id = @this_user)
编辑使结果从1开始而不是从0开始
SELECT q.*,
@r := @r + 1 AS rank
FROM (
SELECT @r := 0
) vars,
(
SELECT u.*,
SUM(p.points) AS sum_points
FROM
user u
LEFT JOIN
points p
ON p.user_id = u.id
GROUP BY
u.id
ORDER BY
sum_points DESC
) q
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.