使用MySQL,如何在表中生成包含记录索引的列?

The*_*der 99 mysql indexing

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

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

我想对用户进行排名,以便我可以分辨出特定用户的位置,即.乔是200中的第100位,即

User Score Row
Joe  100    1
Bob  50     2
Bill 10     3
Run Code Online (Sandbox Code Playgroud)

我在这里看到了一些解决方案,但我已经尝试了大部分解决方案,但实际上没有一个返回行号.

我试过这个:

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

如派生的

...但它似乎没有返回行位置.

有任何想法吗?

Dan*_*llo 170

您可能想尝试以下方法:

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

JOIN (SELECT @curRow := 0)部分允许变量初始化而无需单独的SET命令.

测试用例:

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);
Run Code Online (Sandbox Code Playgroud)

测试查询:

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;
Run Code Online (Sandbox Code Playgroud)

结果:

+----------+----------+-------+------------+
| position | username | score | row_number |
+----------+----------+-------+------------+
|        3 | c        |    75 |          1 |
|        5 | e        |    55 |          2 |
|        6 | f        |    80 |          3 |
+----------+----------+-------+------------+
3 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

  • 人们应该知道这个行号是在*任何排序之前计算的,所以如果订单改变了行顺序,这些数字可能会变得混乱. (20认同)
  • 您还可以通过用逗号替换`JOIN`语句来初始化`@curRow`,如下所示:`FROM league_girl l,(SELECT @curRow:= 0)r` (19认同)
  • 有没有办法在"ORDER BY"之后计算这个行号? (7认同)
  • @Mike:那是真的.这可能也更整洁.感谢您分享此提示. (2认同)
  • @smhnaji MySQL要求每个"派生表"都有一个名称.我决定把它称为"r":) ...在这种情况下它没有什么用处,但你通常用它来引用派生表的属性,就好像它是一个真正的表. (2认同)
  • 是否可以查询特定的行号?即使用上面的查询row_number 2和3? (2认同)

Pet*_*son 37

SELECT @i:=@i+1 AS iterator, t.*
FROM tablename t,(SELECT @i:=0) foo
Run Code Online (Sandbox Code Playgroud)


小智 7

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

  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
Run Code Online (Sandbox Code Playgroud)

这是我的工作代码:

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
Run Code Online (Sandbox Code Playgroud)