用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)); }