使用 MySQL 获取用户排名
Posted
技术标签:
【中文标题】使用 MySQL 获取用户排名【英文标题】:Get user rank with MySQL 【发布时间】:2012-04-28 12:14:00 【问题描述】:我阅读了很多关于这个问题的主题,但我找不到解决方案。
我有一张包含我网站用户的表格(称为用户)。他们有积分。例如:
+-----------+------------+
| User_id | Points |
+-----------+------------+
| 1 | 12258 |
| 2 | 112 |
| 3 | 9678 |
| 4 | 689206 |
| 5 | 1868 |
+-----------+------------+
在页面顶部设置了变量 $user_id。比如user_id是4。现在我想通过积分来获取用户的排名(如果user_id是4,输出应该是1)。
非常感谢!
【问题讨论】:
“找不到解决方案”是什么意思?您是否在寻找“要执行的代码”? 这是你要找的***.com/questions/3614666/… 是的,我正在寻找代码。我在其他 *** 指南的帮助下尝试了一些事情,但我无法让它工作:-( 【参考方案1】: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
【讨论】:
【参考方案2】:这个查询应该做你想做的:
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;
【讨论】:
【参考方案3】:如果您不想在 mysql 之外执行此操作,则需要使用变量来计算排名。
这是一个准确描述您想要的解决方案:
http://www.fromdual.ch/ranking-mysql-results
您仍然需要,您希望直接为每条记录拥有它,将其存储在记录中并自行更新。没有任何合理的查询可以直接为您提供排名而无需存储在真实表上(我的意思是不只是几百条记录)。
【讨论】:
非常感谢。但是我应该怎么做:进行 MySQL 查询或在 for 循环中使用 php 进行检查?我的意思是:如果有超过 40.000 个用户,什么会更快? 我更新了一点。除非你的桌子很小,否则你必须保持排名。 好的,你的意思是我应该将排名存储在表格中?而且我不应该在排名页面上计算它? 是的。您应该分别处理计算(例如,当您更改值或批量更改值时)和显示。因为所有基于 sql 的计算都很慢。 这个不需要变量。【参考方案4】:已经有a simple solution,正好适合你的目的。
【讨论】:
很确定他没有要求 php 代码,他甚至没有提到 php。 不知道哪个更好更快? PHP 还是 MySQL? 我只是在诱导以下行:On the top of the page the variable $user_id is set.
他在我的回答中提到了 cmets 中的 PHP,所以这可能确实让他感兴趣。无需投票。【参考方案5】:
这可能会有所帮助
SELECT @rank:=@rank+1 AS rank,`User_id`,`Points` FROM `users` u JOIN (SELECT @rank:=0) r ORDER BY u.Points DESC
【讨论】:
以上是关于使用 MySQL 获取用户排名的主要内容,如果未能解决你的问题,请参考以下文章