MySQL 在 where 子句中分配用户定义的变量
MySQL assign user-defined variable in where clause
第一个查询 sql 将转换为:
SELECT name,(@num)
FROM test WHERE 1
在select子句中,(@num : @num + 1)
return 1,所以意思是最后一个查询sql等于:
SELECT name,(@num)
FROM test WHERE 1 <= 1
?
如果是,为什么第二次只查询return第一条记录?
如果不是,WHERE
子句中的 (@num := @num + 1)
是什么?
为什么第 3 个查询中的 @num
是 4
?
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
没有零钱。
案例二查询:
如果是第一次迭代中的第二个查询,它将解析为上述查询。
第一次迭代:
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 子句中的条件。其他人被丢弃。
第一个查询 sql 将转换为:
SELECT name,(@num)
FROM test WHERE 1
在select子句中,(@num : @num + 1)
return 1,所以意思是最后一个查询sql等于:
SELECT name,(@num)
FROM test WHERE 1 <= 1
?
如果是,为什么第二次只查询return第一条记录?
如果不是,WHERE
子句中的 (@num := @num + 1)
是什么?
为什么第 3 个查询中的 @num
是 4
?
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
没有零钱。
案例二查询:
如果是第一次迭代中的第二个查询,它将解析为上述查询。
第一次迭代:
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 子句中的条件。其他人被丢弃。