有什么办法可以从查询中获取实际的行号吗?
我希望能够通过名为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)
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)