Проблема сравнения подзапросов в 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)
эффективно делает так же, как:
ORDER BY id,dividends
;Найти точку, в которой
(660,0.5)
будет сидеть в этом порядке;Фильтруйте только те записи, которые равны или превышают эту точку в заказе.
Следовательно, это так же, как 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