我有一个包含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)
有什么可以解释这个?
答案 0 :(得分:0)
我不确定你为什么感到困惑。代码正在完成你指定的内容。
在第一次迭代期间 - 假设按顺序读取t
(无法保证) - 您有:
id = 1, @x = 2
然后:
id = 2, @x = 4
id = 3, @x = 6
等等。这些值永远不会相等,因此不会返回任何行。
如果您想要每隔一行,请使用mod()
:
where mod(id, 2) = 1
不需要变量。