在mysql中选择增量计数器

iJa*_*ade 33 mysql database select counter

这是我的mysql查询

select name from table;
Run Code Online (Sandbox Code Playgroud)

我想沿着名字选择一个增量计数器.如何做到这一点.所以预期的产量将是

Jay 1
roy 2
ravi 3
ram 4
Run Code Online (Sandbox Code Playgroud)

jue*_*n d 97

select name,
      @rownum := @rownum + 1 as row_number
from your_table
cross join (select @rownum := 0) r
order by name
Run Code Online (Sandbox Code Playgroud)

这部分:

cross join (select @rownum := 0) r
Run Code Online (Sandbox Code Playgroud)

可以在不需要单独查询的情况下引入变量.所以第一个查询也可以分解为两个查询,如下所示:

set @rownum := 0;

select name,
      @rownum := @rownum + 1 as row_number
from your_table
order by name;
Run Code Online (Sandbox Code Playgroud)

例如,在存储过程中使用时.

  • 正如Fabio Reche试图说的那样,我们需要在'rownum + 1'前面用'@'来编写它......它不是假设是`@rownum:= @rownum + 1`? (2认同)

小智 14

在 MySQL 8 及更高版本中,您还可以使用 ROW_NUMBER()Window 函数。

SELECT
    name,
    ROW_NUMBER() OVER ()
FROM table
Run Code Online (Sandbox Code Playgroud)

结果:

Jay  1
roy  2
ravi 3
ram  4
Run Code Online (Sandbox Code Playgroud)

如 juergen d 所示,将 an 放入ORDER BY确定性查询是个好主意。

该ORDER BY可申请查询和独立的计数器。所以:

SELECT
    name,
    ROW_NUMBER() OVER (ORDER BY name DESC)
FROM table
ORDER BY name
Run Code Online (Sandbox Code Playgroud)

会给你一个降序的计数器。

结果:

Jay  4
ram  3
ravi 2
roy  1
Run Code Online (Sandbox Code Playgroud)


小智 11

SELECT name,
      @rownum := @rownum + 1 as row_number
FROM your_table
   ,
   (select @rownum := 0) r
Run Code Online (Sandbox Code Playgroud)

我更喜欢使用逗号而不是CROSS JOIN因为它执行得更快。使用CROSS JOIN将添加一个额外的步骤,即向表中添加一列。

  • 很有意思。你能解释一下这个语法吗?这解决了我在分组项目上使用计数器时遇到的问题,其中结果不一致。在同一会话的控制台上,第一次运行返回全 1,然后从第二次运行开始工作正常。所以它从来没有作为脚本起作用。直到我删除了初始 set @var 命令并使用了您的方法。现在它可以稳定地工作! (2认同)