我遇到了一个很好的解决方案,可以根据用户在 mysql 中的分数对用户进行排名。
SELECT d.*, c.ranks
FROM
(
SELECT Score, @rank:=@rank+1 Ranks
FROM
(
SELECT DISTINCT Score
FROM tableName a
ORDER BY score DESC
) t, (SELECT @rank:= 0) r
) c
INNER JOIN tableName d
ON c.score = d.score
但是,我想知道是否有办法将得分为 0 或没有得分的用户从排名中排除,但仍然在结果中返回这些用户。
比如
KEY username password score Ranks
1 Anna 123 8 1
2 Bobby 345 5 2
3 Helen 678 5 2
4 Jon 567 -2 3
5 Arthur ddd -9 4
4 Chris 444 0
5 Liz eee 0
最佳答案
既然你想选择你所有的用户,那么从这里开始:
SELECT
user.*
FROM user
现在,我们要添加排名用户表,因此我们将开始增加复杂性。我们的目标是获得排名用户的临时表,因此我们将 LEFT JOIN 不过滤掉任何非排名用户。
SELECT
user.*,
ranked_user.score,
ranked_user.rank
FROM user
LEFT JOIN(
// subquery
) AS ranked_user ON ranked_user.user_id = user.id
然后我们必须找出确定排名的子查询部分。您已经掌握了大部分内容,我将添加一个 IF
语句,以便仅在他们有分数时才分配排名。总之,你得到这个:
SELECT
user.*,
ranked_user.score,
ranked_user.rank
FROM user
LEFT JOIN(
SELECT
score,
user_id,
IF(score = 0 OR score IS NULL, null, @rank:=@rank+1) AS rank
FROM(
SELECT
DISTINCT score,
user_id
FROM stat
ORDER BY score DESC
) t, (SELECT @rank:= 0) r
) ranked_user ON ranked_user.user_id = user.user_id
IF
语句的工作原理如下:
IF(score = 0 OR score IS NULL,
# if c.score is 0 or missing
null,
# set the value to null
@rank:=@rank+1)
# otherwise, calculate a rank
AS rank
# call this value "rank"
请注意:我会更改 user.*
并实际列出您想要的 user
的每一列。这被认为是最佳实践。
关于mysql - 从排名中排除得分为零的用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28892510/