代码之家  ›  专栏  ›  技术社区  ›  Steven Mercatante Dimitri Kopriwa

如何根据字段获得行相对于行总数的排名?

  •  1
  • Steven Mercatante Dimitri Kopriwa  · 技术社区  · 15 年前

    我有一个 scores 有两个字段的表:

    • 用户标识
    • 分数

    我正在获取与用户ID列表匹配的特定行。如何根据 score ?结果集中的行不一定是连续的(分数在每一行之间会有很大的差异)。我不确定这是否重要,但是 user_id 是唯一字段。

    编辑

    @ Greelmo

    我已经订好了。如果我取15行,我不希望排名是1-15。我需要它是该行相对于整个表的位置 分数 财产。因此,如果我有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 回复  |  直到 15 年前
        1
  •  1
  •   Thomas    15 年前
    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
    

    当然,如果两个分数有可能在日期上创建相同的分数,那么您仍然会得到平局,需要确定第三个平局破坏者。

        2
  •  0
  •   Dexter    15 年前

    您可以在查询中对数据进行排序。

    SELECT user_id, score FROM table ORDER BY score ASC;
    

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

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

    编辑

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