是否可以在mysql/mariadb中的一个select语句中创建一个计数器。我尝试了以下操作,但它只返回第一列中的值1:
SELECT @rownr := IF(ISNULL(@rownr),0,@rownr)+1 AS rowNumber, * FROM table_x LIMIT 0,10
如果我在同一个mysql示例中更频繁地运行该语句,它将从最后一个数字开始计数。第二次从2开始,第三次是12。这意味着该变量已创建,但似乎只有在sql语句发出之前示例化时才可用于修改。
h6my8fg21#
这是可能的,但有点棘手。首先,您需要在 select 条款(单独) set 赋值,或在派生表中)。另外,先对子查询中的行进行排序,然后计算变量更安全。我建议:
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 ).或者,可以在派生表中声明变量:
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() :
row_number()
select t.*, row_number() over(order by id) rn from mytable t order by id limit 10;
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() )在最近的版本中。
SELECT
2条答案
按热度按时间h6my8fg21#
这是可能的,但有点棘手。首先,您需要在
select
条款(单独)set
赋值,或在派生表中)。另外,先对子查询中的行进行排序,然后计算变量更安全。我建议:
注意,我添加了一个
order by
子句,否则未定义按哪个序列行排序(我假定id
).或者,可以在派生表中声明变量:
最后:如果您运行的是mysql 8.0,只需使用
row_number()
:j8yoct9x2#
你没有一个
order by
,因此排序是不确定的。但您可以在语句本身中初始化参数:如果你想要一个特定的订单,你应该使用
order by
在子查询中。还要注意,从mysql 8开始,在
SELECT
已弃用。你应该使用窗口函数(row_number()
)在最近的版本中。