Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL:变量递增的奇怪WHERE行为_Mysql_Increment_Where Clause - Fatal编程技术网

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

MySQL:变量递增的奇怪WHERE行为,mysql,increment,where-clause,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); +---

我有一个包含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 |
...
但是,以下语句不是每隔一行返回一次,而是不返回任何内容:

怎么解释呢


我不知道你为什么感到困惑。代码正执行您指定的操作

在第一次迭代过程中-假设按不保证的顺序读取t-您有:

id = 1, @x = 2
然后:

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

如果需要每隔一行,请使用mod:


变量是不需要的。

为什么它会按顺序在表中显示?我希望它像独立的WHERE语句一样执行,例如在第一次迭代中:WHERE id=2。变量在执行查询时进行处理。一般来说,行由from子句生成,过滤器应用于where,group by,select,having,order by和limit子句。我看不到子句处理顺序与where按顺序遍历表之间的相关性。当其中一个比较项是变量时,优化器是否会自动决定这样做?使用FORCE索引执行查询也没有效果。@concat。我完全不理解你的困惑。MySQL查看表中的第一行。id是1。@x值从零开始,然后递增到2。将1与2进行比较,没有匹配项。因此,该行不在结果集中。在下一次迭代中,id值为2,@x增加到4。再一次,没有匹配,因此结果集中没有任何内容。等等没有ORDERBY子句,但这没有什么区别,因为它会在过滤之后发生。如果我不清楚,很抱歉。我的困惑是,我根本不理解MySQL为什么要查看第一行:从t执行SELECT*FROM,其中id=5使用索引;很明显,当t大得多,但执行时间却不是。我理解最终会发生什么:这就像执行forint id=1,x=2;id16?
id = 1, @x = 2
id = 2, @x = 4
id = 3, @x = 6
where mod(id, 2) = 1