SQL 多行排名 [相同的用户仍将具有相同的排名]
SQL Ranking with multiple rows [Same users will still have same rank ]
我对 SQL 了解一点,我一直想知道如何从我的 Users
table 中 select 用户,我发现了这个:
SELECT *, FIND_IN_SET( Score, (
SELECT GROUP_CONCAT( Score ORDER BY Score DESC )
FROM Users
)
) AS Rank
FROM Users
WHERE UserID = 100
ORDER BY Score DESC
问题是,如果同一用户有多个行,那么他们将单独排名。我想知道如何获得最高的 Score
并拥有 Rank
return 那
它看起来像什么(没有 WHERE UserID = 100
子句):
ID-----UserID-----Score----Rank
1------100--------6--------1
2------192--------4--------2
3------192--------3--------3
我想要的(没有 WHERE UserID = 100
子句):
ID-----UserID-----Score----Rank
1------100--------6--------1
2------192--------4--------2
3------192--------3--------2
感谢您的帮助!
尝试以下操作:
SET @rank=0;
SELECT *, @rank:=@rank+1 AS rank
FROM Users
WHERE UserID = 100
ORDER BY Score DESC
使用 GROUP BY(UserID)
和 MAX(Score)
得到 maxScore
,然后用它排名。
(作为 OP 希望每一行用户,但只有最好的排名,我们添加一个 INNER JOIN
)
SELECT TM.`UserID`, TM.`Score`, T3.`rank`
FROM `Users` as TM
INNER JOIN (
SELECT `UserID`, FIND_IN_SET(
Max(`Score`), (
select GROUP_CONCAT(
DISTINCT `Score`
order by `Score` DESC
)
From (
select MAX(`Score`) as `Score`
FROM `Users` as T0
GROUP BY `UserID`
) as T1
)
) as `rank`
FROM `Users` as T2
group by `UserID`
) as T3
ON TM.`UserID` = T3.`UserID`
-- If we need to filter or sort, we make it here :
WHERE TM.`UserID` = 192
ORDER BY TM.`Score`
您可以统计每个得分较低的用户:
SELECT u.ID, u.UserID u.Score, 1 + COUNT(*) as Rank -- 1 + count every user with less score
FROM Users u
JOIN Users loser
ON loser.Score < u.score -- join with every user having less score
GROUP BY u.ID, u.UserID, u.Score
ORDER BY Rank
我对 SQL 了解一点,我一直想知道如何从我的 Users
table 中 select 用户,我发现了这个:
SELECT *, FIND_IN_SET( Score, (
SELECT GROUP_CONCAT( Score ORDER BY Score DESC )
FROM Users
)
) AS Rank
FROM Users
WHERE UserID = 100
ORDER BY Score DESC
问题是,如果同一用户有多个行,那么他们将单独排名。我想知道如何获得最高的 Score
并拥有 Rank
return 那
它看起来像什么(没有 WHERE UserID = 100
子句):
ID-----UserID-----Score----Rank
1------100--------6--------1
2------192--------4--------2
3------192--------3--------3
我想要的(没有 WHERE UserID = 100
子句):
ID-----UserID-----Score----Rank
1------100--------6--------1
2------192--------4--------2
3------192--------3--------2
感谢您的帮助!
尝试以下操作:
SET @rank=0;
SELECT *, @rank:=@rank+1 AS rank
FROM Users
WHERE UserID = 100
ORDER BY Score DESC
使用 GROUP BY(UserID)
和 MAX(Score)
得到 maxScore
,然后用它排名。
(作为 OP 希望每一行用户,但只有最好的排名,我们添加一个 INNER JOIN
)
SELECT TM.`UserID`, TM.`Score`, T3.`rank`
FROM `Users` as TM
INNER JOIN (
SELECT `UserID`, FIND_IN_SET(
Max(`Score`), (
select GROUP_CONCAT(
DISTINCT `Score`
order by `Score` DESC
)
From (
select MAX(`Score`) as `Score`
FROM `Users` as T0
GROUP BY `UserID`
) as T1
)
) as `rank`
FROM `Users` as T2
group by `UserID`
) as T3
ON TM.`UserID` = T3.`UserID`
-- If we need to filter or sort, we make it here :
WHERE TM.`UserID` = 192
ORDER BY TM.`Score`
您可以统计每个得分较低的用户:
SELECT u.ID, u.UserID u.Score, 1 + COUNT(*) as Rank -- 1 + count every user with less score
FROM Users u
JOIN Users loser
ON loser.Score < u.score -- join with every user having less score
GROUP BY u.ID, u.UserID, u.Score
ORDER BY Rank