Задать вопрос
@RomanGorbatko
PHP, Python, NodeJS, Swift

Почему LIKE не учитывает IN ()?

SELECT uf.user_id as is_featured, uf.ordering as featured_order, friend.friend_id AS is_friend, frequest.request_id AS is_friend_request, u.status_id as unverified, u.*, ufield.*
FROM user AS u
LEFT JOIN user_custom AS ucv
	ON(ucv.user_id = u.user_id)
LEFT JOIN user_featured AS uf
	ON(uf.user_id = u.user_id)
LEFT JOIN friend AS friend
	ON(friend.user_id = u.user_id AND friend.friend_user_id = 38184)
LEFT JOIN friend_request AS frequest
	ON(frequest.user_id = u.user_id AND frequest.friend_user_id = 38184)
JOIN user_field AS ufield
	ON(ufield.user_id = u.user_id)

WHERE u.user_id IN (37273,37705,38184,39783) AND u.full_name LIKE '%богд%' OR u.middle_name LIKE '%богд%' AND u.status_id = 0 AND u.view_id = 0
GROUP BY u.user_id
ORDER BY u.full_name ASC
LIMIT 21
/* OO Query */


Собственно, LIKE ищет по всем записям БД, но должен только по тем, которые прописаны в AND u.user_id IN (37273,37705,38184,39783).

В чем дело?
  • Вопрос задан
  • 2520 просмотров
Подписаться 4 Оценить Комментировать
Решения вопроса 2
disc
@disc
веб-разработчик
Скорее всего дело в OR. Сгруппируйте условия используя скобки.
Ответ написан
Комментировать
Alexious_sh
@Alexious_sh
Вам бы про приоритеты логических операторов почитать. В вашем случае условие WHERE разберется так:
u.user_id IN (37273,37705,38184,39783) AND u.full_name LIKE '%богд%'
или
u.middle_name LIKE '%богд%' AND u.status_id = 0 AND u.view_id = 0


Если я правильно понял что вы хотите, то нужно написать так:
u.user_id IN (37273,37705,38184,39783) AND (u.full_name LIKE '%богд%' OR u.middle_name LIKE '%богд%') AND u.status_id = 0 AND u.view_id = 0


Но вообще OR не рекомендуют использовать на больших объемах данных, т.к. он практически всегда ломает выборку по индексам.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы