我有一个scores
表,其中有两个字段:
我正在获取与user_id列表匹配的特定行。如何根据score
确定每行相对于总行数的排名?结果集中的行不一定是顺序的(分数将从一行到下一行变化很大)。我不确定这是否重要,但user_id
是一个独特的领域。
修改
@Greelmo
我已经订购了这些行。如果我获取15行,我不希望等级为1-15。我需要将它作为该行的位置与score
属性与整个表进行比较。因此,如果我有200行,则一行的等级可以是3,另一行可以是179(例如,这些是任意的#)。
编辑2
我对这个查询感到很幸运,但实际上我想避免关系
SELECT
s.score
, s.created_at
, u.name
, u.location
, u.icon_id
, u.photo
, (SELECT COUNT(*) + 1 FROM scores WHERE score > s.score) AS rank
FROM
scores s
LEFT JOIN
users u ON u.uID = s.user_id
ORDER BY
s.score DESC
, s.created_at DESC
LIMIT 15
如果两行或更多行具有相同的分数,我希望最新的一行(或最早 - 我不在乎)排名更高。我尝试用AND id > s.id
修改子查询但最终给了我一个意想不到的结果集和不同的关系。
答案 0 :(得分:1)
Select S.score, S.created_at, U.name
, U.location, U.icon_id, U.photo
, (Select Count(*) + 1
From scores S2
Where S2.score > S.score
Or (S2.score = S.Score And S2.created_at > S.created_at)
) AS rank
From scores S
Left Join users U
On U.uID = S.user_id
Order By S.score DESC, S.created_at DESC
LIMIT 15
当然,如果两个分数有可能具有相同的created_at日期,那么你仍然会得到关系并需要确定第三个决胜局。
答案 1 :(得分:0)
您可以在查询中订购数据。
SELECT user_id, score FROM table ORDER BY score ASC;
这将为您提供从最低分到最高分的数据。
如果这不能回答你的问题,那么我不明白你在问什么。
修改强>
要获得该位置,在迭代数据库结果时,只需保留一个计数器。