用MySQL,我怎样才能生成一个表中包含logging索引的列?

有什么办法可以从查询中得到实际的行号吗?

我希望能够通过一个名为score的字段来订购名为league_girl的表格; 并返回用户名和该用户名的实际行位置。

我想排名的用户,所以我可以告诉哪里是一个特定的用户,即。 Joe是200中的第100位,即

User Score Row Joe 100 1 Bob 50 2 Bill 10 3 

我已经在这里看到了一些解决scheme,但是我已经尝试了大部分解决scheme,其中没有一个实际返回行号。

我试过这个:

 SELECT position, username, score FROM (SELECT @row := @row + 1 AS position, username, score FROM league_girl GROUP BY username ORDER BY score DESC) 

作为派生

…但似乎没有返回行的位置。

有任何想法吗?

您可能想要尝试以下操作:

 SELECT l.position, l.username, l.score, @curRow := @curRow + 1 AS row_number FROM league_girl l JOIN (SELECT @curRow := 0) r; 

JOIN (SELECT @curRow := 0)部分允许variables初始化,而不需要单独的SET命令。

testing用例:

 CREATE TABLE league_girl (position int, username varchar(10), score int); INSERT INTO league_girl VALUES (1, 'a', 10); INSERT INTO league_girl VALUES (2, 'b', 25); INSERT INTO league_girl VALUES (3, 'c', 75); INSERT INTO league_girl VALUES (4, 'd', 25); INSERT INTO league_girl VALUES (5, 'e', 55); INSERT INTO league_girl VALUES (6, 'f', 80); INSERT INTO league_girl VALUES (7, 'g', 15); 

testing查询:

 SELECT l.position, l.username, l.score, @curRow := @curRow + 1 AS row_number FROM league_girl l JOIN (SELECT @curRow := 0) r WHERE l.score > 50; 

结果:

 +----------+----------+-------+------------+ | position | username | score | row_number | +----------+----------+-------+------------+ | 3 | c | 75 | 1 | | 5 | e | 55 | 2 | | 6 | f | 80 | 3 | +----------+----------+-------+------------+ 3 rows in set (0.00 sec) 
 SELECT @i:=@i+1 AS iterator, t.* FROM tablename t,(SELECT @i:=0) foo 

这里是我使用的模板的结构:

  select /*this is a row number counter*/ ( select @rownum := @rownum + 1 from ( select @rownum := 0 ) d2 ) as rownumber, d3.* from ( select d1.* from table_name d1 ) d3 

这是我的工作代码:

 select ( select @rownum := @rownum + 1 from ( select @rownum := 0 ) d2 ) as rownumber, d3.* from ( select year( d1.date ), month( d1.date ), count( d1.id ) from maindatabase d1 where ( ( d1.date >= '2013-01-01' ) and ( d1.date <= '2014-12-31' ) ) group by YEAR( d1.date ), MONTH( d1.date ) ) d3 

你也可以使用

 SELECT @curRow := ifnull(@curRow,0) + 1 Row, ... 

初始化计数器variables。

假设MySQL支持它,你可以很容易地用一个标准的SQL子查询来做到这一点:

 select (count(*) from league_girl l1 where l2.score > l1.score and l1.id <> l2.id) as position, username, score from league_girl l2 order by score; 

对于大量的显示结果,这将有点慢,你会想切换到自联接。

如果您只想按照字段得分顺序知道某个特定用户的位置,则可以简单地从表格中select字段得分高于当前用户得分的所有行。 并使用行号返回+1来知道当前用户的哪个位置。

假设你的表是“league_girl”,你的主字段是“id”,你可以使用这个:

 SELECT count(id) + 1 as rank from league_girl where score > <your_user_score> 

我知道OP是要求一个mysql答案,但由于我发现其他答案不适合我,

  • 他们中的大多数都按order by失败
  • 或者,他们只是非常无效,并使您的查询非常缓慢的胖表

所以为了节省像我这样的其他人的时间, 只需从数据库中检索行索引

在PHP中的例子:

  $users = UserRepository::loadAllUsersAndSortByScore(); foreach($users as $index=>&$user){ $user['rank'] = $index+1; } 

在PHP中使用偏移量和限制分页的例子:

  $limit = 20; //page size $offset = 3; //page number $users = UserRepository::loadAllUsersAndSortByScore(); foreach($users as $index=>&$user){ $user['rank'] = $index+1+($limit*($offset-1)); }