首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL @rownum:=@rownum+1

MySQL @rownum:=@rownum+1
EN

Stack Overflow用户
提问于 2018-01-09 05:46:23
回答 3查看 4.6K关注 0票数 1
代码语言:javascript
复制
SET @rownum := -1;

SELECT
   round(AVG(t.LAT_N),4)
FROM
(
   SELECT
      @rownum := @rownum + 1 AS rownum,
      STATION.LAT_N AS LAT_N
   FROM
      STATION
   ORDER BY STATION.LAT_N
) AS t
WHERE
   t.rownum IN (
      CEIL(@rownum/2),
      FLOOR(@rownum/2)
   )
;

在上述代码中,

  1. @rownum:=@rownum+1是如何工作的?

这就像用Python写东西一样:i= i+1

这在for循环的上下文中是有意义的,但是在上面的SQL代码中for循环在哪里( select做for循环吗?)

  1. 此外,在WHERE子句中,@rownum被用作表示表中最大行的变量,而在SELECT中,它被用作表示当前行迭代遍历的单个行号的变量。为什么?
  2. 据我所知,@rownum声明了一个实例变量,该变量持久存在于WHERE子句中。那么,做“作为花冠”有什么意义呢?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-01-09 06:05:25

此查询使用行号会话变量计算表中的中值LAT_N值。考虑一个简单的场景,其中的LAT_N值从1到10不等。然后,在分配行号(基于零)之后,我们将有以下中间表:

代码语言:javascript
复制
LAT_N | rownum
1     | 0
2     | 1
3     | 2
4     | 3
5     | 4
6     | 5
7     | 6
8     | 7
9     | 8
10    | 9

在迭代内部子查询结束时,@rownum (从-1开始)的值为9。外部查询如下所示:

代码语言:javascript
复制
SELECT ROUND(AVG(t.LAT_N), 4)
FROM
(the above table) t
WHERE
    t.rownum IN (CEIL(@rownum/2), FLOOR(@rownum/2));

这就是LAT_N的平均值,生成的行号要么是4,要么是5。这将产生5.5的中值。请注意,对于奇数的记录,上限和下限都会产生相同的数字,并且只有一个真正的中值。

演示

票数 2
EN

Stack Overflow用户

发布于 2018-01-09 06:12:06

  • @rownum:=@rownum+1就像i = i + 1一样工作。
  • AS rownum正在为该字段创建别名(请参见:别名语法)。您可以为任何字段或表创建别名。

实际上,您的SQL语句中有两个select查询。

SELECT @rownum := @rownum + 1 AS rownum, STATION.LAT_N AS LAT_N FROM STATION ORDER BY STATION.LAT_N

这是一个所谓的子查询,其结果将被视为一个表,其中主查询将检索信息。

对于子查询,您没有给出一个WHERE子句,因此它将检索STATION表中的每一行记录。由于您将@rownum := @rownum + 1 AS rownum写入第一个结果列,因此每一行的@rownum将增加1。所以,它就像一个for循环。

在这种情况下,子查询总是在主查询之前运行。因此,在main查询的WHERE子句中,@rownum已经等于STATION表的行计数。

票数 2
EN

Stack Overflow用户

发布于 2018-01-09 06:04:24

是的,这个@rownum只对列值使用一个动态变量--它可以作为行索引,仅当您分配别名并在中使用子句中测试它时,或者使用子查询。

没有用于select的循环,有一个指针分配给数据中跟踪的每一行,而@rownum已经被:=操作符分配给了以前的值。

您的查询可能是这样的,条件可能是可变的,但是方法是完全的,如果您指定别名或子查询,conceptualized.You可以使用它作为行索引。

注意:在第二个条件中,如果条件为false,则不能使用@rownum,因为在最后一个条件中包含一个特定值,如果任何条件不匹配,那么它将不返回数据,但返回,如果条件为真,则可以使用它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48162099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档