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

时间:2016-11-08 09:19:22

标签: 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

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

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

为什么第三次查询中的@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

1 个答案:

答案 0 :(得分:0)

案例第一查询:

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

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不会发生变化。

案例第二查询:

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

第一次迭代:

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;

第3次迭代:

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

在这里看一下,只有第一次迭代才能在where子句中限定条件。其他人则被放弃了。