【问题标题】:mysql find location of rowmysql查找行的位置
【发布时间】:2011-06-06 05:41:03
【问题描述】:

我有一个数据库,其中包含我创建的游戏的用户分数。我正在尝试添加一个功能来向用户展示他们当前的排名。

我需要一个查询,该查询将按分数 DESC 对行进行排序,然后定位用户分数并通过用户名获取他/她的排名。

我知道这是一个非常简单的查询,但我的大脑现在无法正常工作。

CREATE TABLE HighScores(
   id       int(11)      NOT NULL auto_increment
  ,deviceID varchar(100) NOT NULL
  ,username varchar(50)  NOT NULL
  ,score    varchar(10)  NOT NULL
  ,game     int(2)       NOT NULL
  ,spins    int(10)      NOT NULL
  ,PRIMARY KEY (id)
 );

【问题讨论】:

  • 如果不存在则创建表 HighScores ( id int(11) NOT NULL auto_increment, deviceID varchar(100) NOT NULL, username varchar(50) NOT NULL, @987654326 @varchar(10) 非空,gameint(2) 非空,spinsint(10) 非空,主键 (id))

标签: mysql database


【解决方案1】:

由于我不知道您的表结构,因此很难提出查询。

This article 完全符合您的要求。

查询示例:

select @rownum:=@rownum+1 ‘rank’, p.* from player p, (SELECT @rownum:=0) r order by score desc limit 10;

神奇的地方在于变量rownum,它是每行递增的变量。

【讨论】:

  • 为什么这是一个公认的答案?它没有按照要求做:它没有给出特定用户名的排名位置
【解决方案2】:

假设表结构如下:

create table users(
   user_id
  ,score    int
  ,primary key(user_id)
);

您可以通过计算得分较低的用户数来计算用户的排名。

select user_id
      ,score
      ,(select count(*) + 1 from users x where u.score < x.score) as rank
  from users u
 where u.user_id = ?

【讨论】:

    【解决方案3】:
    SET @rank:= 0;
    SELECT rank, score FROM (
                        SELECT @rank:= @rank + 1 AS rank, id, score
                        FROM scores ORDER BY score DESC
                        ) as result WHERE id=xxx;
    

    【讨论】:

      【解决方案4】:
      SET @rank=0;
      
      SELECT username, rank
      FROM (
        SELECT username, @rank:=@rank+1 AS rank
        FROM HighScores 
        ORDER BY score DESC
      ) AS t
      WHERE username = :username
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-03-03
        • 1970-01-01
        • 1970-01-01
        • 2016-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多