Я обнаружил, что, как представляется, ошибка в MySQL
http://bugs.mysql.com/bug.php?id=79675
Объяснение и обходной путь:
У меня есть подзапрос EXISTS, который возвращает разные результаты для одних и тех же данных в разных версиях MySQL.
Пример запроса: выберите PCR # 100 и убедитесь, что один из членов экипажа имеет user_id
= 10
SELECT *
FROM pcrs
WHERE id = 100
AND EXISTS (
SELECT NULL FROM pcrs p
LEFT OUTER JOIN crews ON crews.pcr_id = p.id
WHERE crews.user_id = 10
AND p.id = pcrs.id
)
В MySQL 5.5 запрос работает правильно и в одну строку (id
= 100) возвращается.
В MySQL 5.7 тот же запрос неправильно возвращает никаких результатов.
Интересно, если я изменю внешний WHERE
от
WHERE id = 100
в
WHERE id BETWEEN 100 and 101
Тогда MySQL 5.7 правильно возвращает одну строку (id
= 100)
При сопоставлении определенного идентификатора строки во внешнем запросе подзапрос EXISTS всегда завершается неудачей (на 5.7, а возможно, и на 5.6)
Эта проблема вызвана / вызвана переключателем оптимизатора MySQL: index_merge_intersection
,
Если я изменю этот параметр на OFF:
SET optimizer_switch="index_merge_intersection=off";
запрос работает как ожидалось в 5.7
Задача ещё не решена.
Других решений пока нет …