我有一个小的mysql表(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。为什么呢?
答案 0 :(得分:7)
您正在使用行构造函数。 MySQL将它们视为表的行。因此,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
。
答案 1 :(得分:2)
查看你的where子句,关于id的所有内容首先评估为true,然后评估其他所有内容,但不得与第一个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));
答案 2 :(得分:0)
拆分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/