2016-11-08 92 views
1

的第一查询的SQL将转换为:MySQL的分配在用户定义的变量where子句

SELECT name,(@num) 
FROM test WHERE 1 

在选择的子句,(@num : @num + 1)返回1,所以是意味着上次查询SQL等于:

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

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

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

为什么@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 

回答

0

案例1查询:

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

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 

看这里ONL y第一次迭代限定where子句中的条件。其他人被抛弃。

+0

你能解释一下更新后的最后一个查询吗? – consatan

+0

同样的解释(你的上一个查询)适用于更新的最后一个查询。由于结果集只包含一行,'ORDER BY name'不起作用。 – 1000111

+0

对不起,我想问,为什么'@ num'结果是'4' – consatan