2013-09-19 2 views
0

Я запускаю запрос в PHP, и я получаю множество результатов. Вот запрос:Почему мой запрос MySQL возвращает неверные данные с значениями IN

mysql> SELECT `location` FROM `listings` WHERE `fulltext` LIKE '%a%' OR `title` LIKE 
'%a%' AND location IN(33702,33709,33714,33716,33760,33762,33771,33773,33777,33781,33782) 
ORDER BY `date` DESC \g 

и это ЦМД результат, который я получаю, который соответствует именно то, что я получаю в PHP перспективе:

+----------+ 
| location | 
+----------+ 
| 78787 | 
| 33782 | 
| 33782 | 
| 98102 | 
| 33782 | 
| 33782 | 
| 33782 | 
| 33782 | 
| 33782 | 
| 56564 | 
| 44569 | 
| 33782 | 
| 33782 | 
+----------+ 
13 rows in set (0.00 sec) 

Как вы можете видеть, что я не должен быть получая 78787,98102,56564 или 44569. Кто-нибудь видит, что может быть неправильным в запросе. Дайте мне знать, если вам нужна дополнительная информация.

P.S. Первоначально я использовал эту настройку для использования RLIKE, и это будет снова, как только я это выясню.

+4

Два слова: приоритет оператора – Barmar

+0

группировать ваше условие «ИЛИ», например. 'WHERE (\' fulltext \ 'LIKE ..... ИЛИ title LIKE ...) AND location IN()' –

+0

Спасибо, что так много ... Parens работал. –

ответ

4

Похоже, что приоритет вашего OR неверен. Попробуйте:

SELECT `location` FROM `listings` WHERE (`fulltext` LIKE '%a%' OR `title` LIKE '%a%') AND location IN(33702,33709,33714,33716,33760,33762,33771,33773,33777,33781,33782) ORDER BY `date` DESC 

Важно здесь использовать скобки, чтобы отделить два основных условия:

  1. проверки title ИЛИ fulltext
  2. проверка расположения
+0

Гении, каждый из вас ... Спасибо, что сделал. –

1

Из-за operator precedence, ваш запрос обрабатывается следующим образом:

SELECT `location` 
FROM `listings` 
WHERE `fulltext` LIKE '%a%' 
    OR (
     `title` LIKE '%a%' 
    AND LOCATION IN(33702,33709,33714,33716,33760,33762,33771,33773,33777,33781,33782) 
) 
ORDER BY `date` DESC 

Который я не думаю, что вы хотите. Попробуйте добавить круглые скобки, где вы хотите вызвать правильную оценку предложения WHERE.

0

Совет в следующий раз запустите эти запросы. Затем вы можете увидеть, как оптимизатор переписывает ваш запрос и почему ваш результат неправильный.

Примечание иногда отображается в ШОУ ПРЕДУПРЕЖДЕНИЙ запроса всегда Недействительный SQL часто бывает с IN или NOT EXISTS subquerys

EXPLAIN EXTENDED ваш запрос; ПРЕДУПРЕЖДЕНИЯ SHOW;

Смежные вопросы