MySQL 行子查询比较问题
MySQL row subquery comparison issue
我有小mysqltable(MySQL版本5.6.23):
+-----------+-----------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-----------------+------+-----+---------+----------------+
| id | int(6) unsigned | NO | PRI | NULL | auto_increment |
| dividends | float(8,6) | YES | | NULL | |
+-----------+-----------------+------+-----+---------+----------------+
我的 where 子句遵循 row-subqueries 语法。
如果我这样做:
SELECT id, dividends FROM test
where (id,dividends) >= (660,0.5);
或
SELECT id, dividends FROM test
where (id,dividends) >= (660,CAST(0.5 AS DECIMAL(8,6)));
我得到这个结果:
+-----+-----------+
| id | dividends |
+-----+-----------+
| 660 | 0.500000 |
| 661 | 0.470000 |
| 662 | 0.470000 |
| 663 | 0.470000 |
| 664 | 2.580000 |
| 665 | 2.581000 |
...
在我看来,股息 >= 0.5 没有被考虑在内。为什么?
拆分 WHERE 条件以使其工作
SELECT id, dividends
FROM test
WHERE id >= 660
AND dividends >= 0.5;
当使用多列 IN 且仅在第一列定义索引时不使用:
这里讨论了类似的问题,可能有用http://www.percona.com/blog/2008/04/04/multi-column-in-clause-unexpected-mysql-issue/
查看您的 where 子句,所有与 id 有关的内容首先评估为真,然后评估其他所有内容,但不得与第一个 id 结果冲突。也有可能你没有大于 660 的 id 大于 0.5 的股息。
(id,dividends) >= (660,CAST(0.5 AS DECIMAL(8,6)));
SQL 查询将始终首先开始评估所有字段的 id >= 660 ...然后评估股息...您可以尝试 运行 下面的查询并检查结果
where ((id) >= (660)) AND ((dividends) >= (0.5));
您正在使用行构造函数。 MySQL 将它们视为 table 的 行。因此 WHERE (id,dividends) >= (660,0.5)
实际上与以下内容相同:
ORDER BY id,dividends
;
找到 (660,0.5)
在该顺序中的位置;
仅筛选那些等于或大于排序中该点的记录。
因此,与WHERE (id=660 AND dividends>=0.5) OR id>660
相同。
看来你真正想表达的逻辑是WHERE id>=660 AND dividends>=0.5
。
我有小mysqltable(MySQL版本5.6.23):
+-----------+-----------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-----------------+------+-----+---------+----------------+
| id | int(6) unsigned | NO | PRI | NULL | auto_increment |
| dividends | float(8,6) | YES | | NULL | |
+-----------+-----------------+------+-----+---------+----------------+
我的 where 子句遵循 row-subqueries 语法。
如果我这样做:
SELECT id, dividends FROM test
where (id,dividends) >= (660,0.5);
或
SELECT id, dividends FROM test
where (id,dividends) >= (660,CAST(0.5 AS DECIMAL(8,6)));
我得到这个结果:
+-----+-----------+
| id | dividends |
+-----+-----------+
| 660 | 0.500000 |
| 661 | 0.470000 |
| 662 | 0.470000 |
| 663 | 0.470000 |
| 664 | 2.580000 |
| 665 | 2.581000 |
...
在我看来,股息 >= 0.5 没有被考虑在内。为什么?
拆分 WHERE 条件以使其工作
SELECT id, dividends
FROM test
WHERE id >= 660
AND dividends >= 0.5;
当使用多列 IN 且仅在第一列定义索引时不使用:
这里讨论了类似的问题,可能有用http://www.percona.com/blog/2008/04/04/multi-column-in-clause-unexpected-mysql-issue/
查看您的 where 子句,所有与 id 有关的内容首先评估为真,然后评估其他所有内容,但不得与第一个 id 结果冲突。也有可能你没有大于 660 的 id 大于 0.5 的股息。
(id,dividends) >= (660,CAST(0.5 AS DECIMAL(8,6)));
SQL 查询将始终首先开始评估所有字段的 id >= 660 ...然后评估股息...您可以尝试 运行 下面的查询并检查结果
where ((id) >= (660)) AND ((dividends) >= (0.5));
您正在使用行构造函数。 MySQL 将它们视为 table 的 行。因此 WHERE (id,dividends) >= (660,0.5)
实际上与以下内容相同:
ORDER BY id,dividends
;找到
(660,0.5)
在该顺序中的位置;仅筛选那些等于或大于排序中该点的记录。
因此,与WHERE (id=660 AND dividends>=0.5) OR id>660
相同。
看来你真正想表达的逻辑是WHERE id>=660 AND dividends>=0.5
。