Проблема сравнения подзапросов в MySQL

У меня есть небольшая таблица 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 соответствует синтаксису строк-подзапросов.
Если я сделаю:

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 ответа

Решение

Вы используете конструкторы строк. MySQL обрабатывает их точно так же, как строки таблицы. таким образом WHERE (id,dividends) >= (660,0.5) эффективно делает так же, как:

  1. ORDER BY id,dividends;

  2. Найти точку, в которой (660,0.5) будет сидеть в этом порядке;

  3. Фильтруйте только те записи, которые равны или превышают эту точку в заказе.

Следовательно, это так же, как WHERE (id=660 AND dividends>=0.5) OR id>660,

Похоже, что логика, которую вы действительно хотите выразить WHERE id>=660 AND dividends>=0.5,

Глядя на ваше предложение where, все, что касается id, сначала оценивается как true, а затем все остальное оценивается, но не должно конфликтовать с первыми результатами id. Также возможно, что у вас нет идентификатора больше 660 с дивидендом больше 0,5.

    (id,dividends) >= (660,CAST(0.5 AS DECIMAL(8,6)));

SQL-запрос всегда будет начинать оценку идентификатора в первую очередь для всех полей>= 660 ... Затем оценивать дивиденды... вы можете попробовать выполнить запрос ниже и проверить результаты

    where ((id) >= (660)) AND ((dividends) >= (0.5));

Разделите ГДЕ условия, чтобы заставить это работать

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

Другие вопросы по тегам