我阅读了很多有关此问题的主题,但我找不到解决方案。
我有一个表(称为用户)与我的网站的用户。他们有积分。例如:
+-----------+------------+
| User_id | Points |
+-----------+------------+
| 1 | 12258 |
| 2 | 112 |
| 3 | 9678 |
| 4 | 689206 |
| 5 | 1868 |
+-----------+------------+
在页面顶部设置变量$ user_id。例如,user_id为4.现在我想按点获得用户的排名(如果user_id为4,则输出应为1)。
非常感谢!
答案 0 :(得分:12)
SELECT
COUNT(*) AS rank
FROM users
WHERE Points>=(SELECT Points FROM users WHERE User_id=4)
更新了一些更实用的内容:
SELECT
user_id,
points,
(SELECT COUNT(*)+1 FROM users WHERE Points>x.points) AS rank_upper,
(SELECT COUNT(*) FROM users WHERE Points>=x.points) AS rank_lower
FROM
`users` x
WHERE x.user_id = 4
包括用户所在的排名范围。因此,例如,如果前五个位置的分数是5 4 3 3 3,那么结果将是:
id points rank_upper rank_lower
id 5 1 1
id 4 2 2
id 3 3 5
id 3 3 5
id 3 3 5
答案 1 :(得分:1)
此查询应该执行您想要的操作:
SELECT rank FROM (
SELECT User_id, Points,
FIND_IN_SET(
Points,
(SELECT GROUP_CONCAT(
DISTINCT Points
ORDER BY Points DESC
)
FROM users)
) as rank
FROM users )
WHERE User_id = 4;
答案 2 :(得分:0)
如果您不想在mysql之外执行此操作,则需要使用变量来计算排名。
这是一个准确描述您想要的解决方案:
http://www.fromdual.ch/ranking-mysql-results
您仍然需要,您希望直接为每条记录提供它,将其存储在记录中并自行更新。没有合理的查询可以直接为您提供真实表格上没有存储空间的排名(我的意思不仅仅是几百条记录)。
答案 3 :(得分:0)
已经a simple solution,只适合您的目的。
答案 4 :(得分:0)
这可能会有所帮助
SELECT @rank:=@rank+1 AS rank,`User_id`,`Points` FROM `users` u JOIN (SELECT @rank:=0) r ORDER BY u.Points DESC