如何根据字段获取相对于总行数的行级别?

时间:2010-05-11 05:58:53

标签: sql mysql

我有一个scores表,其中有两个字段:

  • user_id
  • 得分

我正在获取与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修改子查询但最终给了我一个意想不到的结果集和不同的关系。

2 个答案:

答案 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;

这将为您提供从最低分到最高分的数据。

如果这不能回答你的问题,那么我不明白你在问什么。

修改

要获得该位置,在迭代数据库结果时,只需保留一个计数器。