想知道为什么我必须在MySQL中分配会话变量?

3
为什么我必须将值分配给会话变量,才能在像这样的查询中获得正确的数值:

SELECT @row_number := @row_number + 1, name FROM cities;

不要像这样:

SELECT @row_number, name FROM cities;

在第二种形式中,它返回的是最后一行的行号,我猜可能是 COUNT(*) 的值。这个值似乎已经被封闭了起来。这两个查询到底发生了什么?

不需要将其分配给会话变量,你正在分配哪个会话变量? - aRvi
如果你不对它进行赋值,它就不会每次加1。 - Barmar
@aRvi @row_number 是会话变量。 - Barmar
3个回答

1

你有一个@row_number变量。每次以下SQL命中记录时,它都会显示结果并递增一。

SELECT @row_number := @row_number + 1, name FROM cities;

如果您正在使用MySQL 8.0+,您可以使用row_number窗口函数来实现相同的结果。
select row_number() over (order by <pk>) rn, name from cities;

如果我们回到 SELECT @row_number, name FROM cities;,你没有增加 @row_number 的值,因此始终显示相同的值,这个值是为 @row_number 分配的值。
PS: 请注意,您没有在查询中使用 order by 子句,这可能导致行编号不一致。

0

你需要对它进行赋值,以便在每一行上将1加到该值。如果不这样做,你会得到相同的值,而不是行号。它将是上次分配变量剩下的内容,可能是之前查询的总行数,这个查询正确地递增。

如果你正在使用MySQL 8.x,则可以使用ROW_NUMBER()函数替换此会话变量的使用。


0

不必使用会话变量,对于MySQL 8+版本,您可以使用ROW_NUMBER(),而对于MySQL 8以下版本,则可以这样做

SELECT @row_number := @row_number + 1, name 
FROM cities,
(SELECT @row_number:= 0) AS x;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接