MySQL:使用递增变量的奇怪WHERE行为

时间:2015-03-21 04:03:15

标签: mysql increment where-clause

我有一个包含16个连续行的表:

CREATE TABLE t (
    id INT NOT NULL PRIMARY KEY AUTO_INCREMENT
);
INSERT INTO t VALUES (),(),(),(),(),(),(),(),(),(),(),(),(),(),(),();

按预期执行以下语句将返回所有行:

mysql> SELECT * FROM t CROSS JOIN (SELECT @x:=0) a WHERE id=(@x:=@x+1);
+----+-------+
| id | @x:=0 |
+----+-------+
|  1 |     0 |
|  2 |     0 |
|  3 |     0 |
...

但是,以下语句不是每隔一行返回一次,而是返回

mysql> SELECT * FROM t CROSS JOIN (SELECT @x:=0) a WHERE id=(@x:=@x+2);
Empty set (0.00 sec)

有什么可以解释这个?

SQL Fiddle

1 个答案:

答案 0 :(得分:0)

我不确定你为什么感到困惑。代码正在完成你指定的内容。

在第一次迭代期间 - 假设按顺序读取t(无法保证) - 您有:

id = 1, @x = 2

然后:

id = 2, @x = 4
id = 3, @x = 6

等等。这些值永远不会相等,因此不会返回任何行。

如果您想要每隔一行,请使用mod()

where mod(id, 2) = 1

不需要变量。