47

这是我的 MySQL 查询:

SELECT name FROM table;

我怎样才能同时选择一个增量计数器name?预期输出:

Jay 1
roy 2
ravi 3
ram 4
4

4 回答 4

124
select name,
      @rownum := @rownum + 1 as row_number
from your_table
cross join (select @rownum := 0) r
order by name

这部分:

cross join (select @rownum := 0) r

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

set @rownum := 0;

select name,
      @rownum := @rownum + 1 as row_number
from your_table
order by name;

例如在存储过程中使用时。

于 2012-11-26T14:19:14.080 回答
14

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

SELECT
    name,
    ROW_NUMBER() OVER ()
FROM table

结果:

Jay  1
roy  2
ravi 3
ram  4

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

ORDER BY可以独立应用于查询和计数器。所以:

SELECT
    name,
    ROW_NUMBER() OVER (ORDER BY name DESC)
FROM table
ORDER BY name

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

结果:

Jay  4
ram  3
ravi 2
roy  1
于 2019-04-26T11:03:33.830 回答
11
SELECT name,
      @rownum := @rownum + 1 as row_number
FROM your_table
   ,
   (select @rownum := 0) r

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

于 2019-11-22T16:41:53.220 回答
1

GROUP BY如果您的查询有语句,则使用交叉连接和逗号的解决方案将不起作用。对于这种情况,您可以使用子选择:

SELECT (@row_number := @row_number + 1) AS rowNumber, res.*
FROM
(
  SELECT SUM(r.amount) 
  FROM Results r 
  WHERE username = 1 
  GROUP BY r.amount
) res
CROSS JOIN (SELECT @row_number := 0) AS dummy
于 2021-01-28T22:14:56.067 回答