A.5.6 Решение проблем с отсутствием строк, удовлетворяющих условиям поиска
Если сложный запрос на множестве таблиц совсем не возвращает строк, то для выяснения причин его неуспешного выполнения необходимо выполнить следующую последовательность действий:
- Проверьте запрос с помощью
EXPLAINи посмотрите, не присутствуют ли в нем явно неправильные записи (Смотри раздел 5.2.1 Синтаксис оператораEXPLAIN(получение информации оSELECT)). - Выберите только поля, используемые в выражении
WHERE. - По одной убирайте из запроса таблицы до тех пор, пока не станут
возвращаться какие-нибудь строки. Если таблицы большие, то в запросе имеет
смысл использовать
LIMIT 10. - Выполните
SELECTдля столбца, который должен был дать совпадение строки с последней исключенной из запроса таблицей. - Если столбцы типа
FLOATилиDOUBLEсравниваются с имеющими дробную часть числами, то нельзя использовать `='. Это распространенная проблема в большинстве компьютерных языков, поскольку значения с плавающей запятой не являются точными. В большинстве случаев проблему решает изменениеFLOATнаDOUBLE. Смотри раздел A.5.7 Проблемы со сравнением чисел с плавающей точкой. - Если так и не удалось выяснить, в чем загвоздка, то для демонстрации
возникших у вас проблем создайте минимальный тест, запускающийся при
помощи
mysql test < query.sql. Тестовый файл можно создать, воспользовавшисьmysqldump --quick database tables > query.sql. Далее откройте файл в редакторе, удалите некоторые команды вставки (если их слишком много) и добавьте в конце файла свою команду выборки. Убедитесь, что проблема по-прежнему проявляется, посредством:shell> mysqladmin create test2 shell> mysql test2 < query.sql
Используяmysqlbug, пошлите тестовый файл в список рассылки на mysql@lists.mysql.com.
