MySQL SELECT 增量计数器
Posted
技术标签:
【中文标题】MySQL SELECT 增量计数器【英文标题】:MySQL SELECT increment counter 【发布时间】:2012-11-14 00:55:52 【问题描述】:这是我的 mysql 查询:
SELECT name FROM table;
如何在name
旁边选择一个增量计数器?预期输出:
Jay 1
roy 2
ravi 3
ram 4
【问题讨论】:
【参考方案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
【讨论】:
【参考方案2】:SELECT name,
@rownum := @rownum + 1 as row_number
FROM your_table
,
(select @rownum := 0) r
我更喜欢使用逗号而不是CROSS JOIN
,因为它执行得更快。使用CROSS JOIN
将增加一个向表中添加列的额外步骤。
【讨论】:
非常有趣。你能解释一下这个语法吗?这解决了我在结果不一致的分组项目上遇到的问题。在同一会话的控制台中,第一次运行返回所有 1,然后从第二次运行开始正常。所以它从来没有作为一个脚本工作。直到我删除了初始 set @var 命令并使用了您的方法。现在它一直有效!【参考方案3】:在 MySQL 8 及更高版本中,您还可以使用ROW_NUMBER()
Window function。
SELECT
name,
ROW_NUMBER() OVER ()
FROM table
结果:
Jay 1
roy 2
ravi 3
ram 4
如 juergen d 所示,最好使用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
【讨论】:
【参考方案4】: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;
例如在存储过程中使用时。
【讨论】:
正如Fabio Reche 所说,我们需要在rownum + 1
前面加上一个'@'...不是应该是@rownum := @rownum + 1
吗?
谢谢,CROSS JOIN
+1,当我需要按 clausule (map/reduce) 分组时解决了另一个问题
子请求用于初始化@rownum。
如果您对值进行排序,此解决方案将无法正常工作。未排序行的计数器增量。
@Paktas:我不知道你在说什么。你能详细说明一下吗?以上是关于MySQL SELECT 增量计数器的主要内容,如果未能解决你的问题,请参考以下文章