MySQL 在 where 子句中分配用户定义的变量

标签 mysql sql variables where-clause user-defined

第一个查询 sql 将转换为:

SELECT name,(@num) 
FROM test WHERE 1

在 select 子句中,(@num : @num + 1) 返回 1,所以意味着最后一个查询 sql 等于:

SELECT name,(@num) 
FROM test WHERE 1 <= 1

?

如果是,为什么第二个查询只返回第一条记录?

如果不是,WHERE子句中的(@num := @num + 1)是什么?

为什么第 3 个查询中的 @num4

CREATE TABLE test (
  id int(1),
  name varchar(10)
);

INSERT INTO test (id, name) VALUES (1, 'a'), (2, 'b'), (3, 'c'), (4, 'd');

SET @num := 0;
SELECT name, @num FROM test WHERE (@num := 1) <= 1;
-- return all records.

SET @num := 0;
SELECT name, @num FROM test WHERE (@num := @num + 1) <= 1;
-- return first record.

SET @num := 0;
SELECT name, @num FROM test WHERE (@num := @num + 1) <= 1 ORDER BY name;
-- return 1 record, name = a, @num = 4

最佳答案

案例 1st 查询:

第一个查询解析为以下等效查询:

SET @num := 0;
SELECT name, @num FROM test WHERE (@num := 1) <= 1;
                V
SET @num := 0;
SELECT name, @num FROM test WHERE 1 <= 1;
                V
SET @num := 0;
SELECT name, @num FROM test WHERE TRUE;

因此,您将获得所有记录。在每次迭代中,1 被分配给 @num。所以,@num 没有变化。

案例 2 查询:

如果是第一次迭代中的第二个查询,它将解析为上述查询。

第一次迭代:

SELECT name, @num FROM test WHERE (@num := @num + 1) <= 1;
                     V
@num is 1
SELECT name, @num FROM test WHERE 1 <= 1;

第二次迭代:

@num is 2 
SELECT name, @num FROM test WHERE 2 <= 1;

第三次迭代:

@num is 3    
SELECT name, @num FROM test WHERE 3 <= 1;
........
....
and so on

看这里,只有第一次迭代符合 where 子句中的条件。其他人被丢弃。

关于MySQL 在 where 子句中分配用户定义的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40483072/

相关文章:

bash - 将变量传递给 psql 脚本

MySQL:错误 1054 (42S22): 'where clause' 中的未知列

mysql - Union alternate 使查询更高效。 mysql

javascript - AngularJS的http服务总是返回错误

sql - 如何在 id 字段上可能有匹配项的地方添加一个新列

swift - 如何在 View Controller 之间传递变量而不需要快速的segue

java - 嵌套的 "For"循环 java - 如何初始化变量 "i"和 "j"?

mysql - 查询每周新用户数量 - 如何按年/周排序?

MySQL:克隆表 A 中的多行和表 B 中的相关行

c# - 数据库删除表