mysql:在sql语句中定义用户变量来创建counter列

wbrvyc0a  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(304)

是否可以在mysql/mariadb中的一个select语句中创建一个计数器。我尝试了以下操作,但它只返回第一列中的值1:

SELECT @rownr := IF(ISNULL(@rownr),0,@rownr)+1 AS rowNumber, * FROM table_x LIMIT 0,10

如果我在同一个mysql示例中更频繁地运行该语句,它将从最后一个数字开始计数。第二次从2开始,第三次是12。这意味着该变量已创建,但似乎只有在sql语句发出之前示例化时才可用于修改。

h6my8fg2

h6my8fg21#

这是可能的,但有点棘手。首先,您需要在 select 条款(单独) set 赋值,或在派生表中)。另外,先对子查询中的行进行排序,然后计算变量更安全。
我建议:

set @rn := 0;
select t.*, @rn := @rn + 1 rowNumber
from (select t.* from mytable t order by id limit 10) t

注意,我添加了一个 order by 子句,否则未定义按哪个序列行排序(我假定 id ).
或者,可以在派生表中声明变量:

select t.*, @rn := @rn + 1 rowNumber
from (select t.* from mytable t order by id limit 10) t
cross join (select @rn := 0) x

最后:如果您运行的是mysql 8.0,只需使用 row_number() :

select t.*, row_number() over(order by id) rn 
from mytable t
order by id
limit 10;
j8yoct9x

j8yoct9x2#

你没有一个 order by ,因此排序是不确定的。但您可以在语句本身中初始化参数:

SELECT @rownr := (@rownr + 1) AS rowNumber, x.*
FROM table_x x.CROSS JOIN
     (SELECT @rownr := 0) params
LIMIT 0, 10;

如果你想要一个特定的订单,你应该使用 order by 在子查询中。
还要注意,从mysql 8开始,在 SELECT 已弃用。你应该使用窗口函数( row_number() )在最近的版本中。

相关问题