MySQL行子查询比较问题

时间:2015-03-23 09:12:06

标签: mysql sql subquery

我有一个小的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。为什么呢?

3 个答案:

答案 0 :(得分:7)

您正在使用行构造函数。 MySQL将它们视为表的行。因此,WHERE (id,dividends) >= (660,0.5)实际上与以下内容有效:

  1. ORDER BY id,dividends;

  2. 找出(660,0.5)在该排序中的位置;

  3. 仅过滤那些等于或大于排序中该点的记录。

  4. 因此,它与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/

在此处跟踪错误http://bugs.mysql.com/bug.php?id=35819