Оператор IN с внутренним запросом SQL
У меня есть этот запрос
SELECT *
FROM `posts`
WHERE `language` IN ( SELECT `possible_languages` FROM `users` WHERE user_id = ? );
В таблице posts
: языки могут быть en
или же ar
В таблице users
: possible_languages
может быть 'en'
, 'ar'
или же 'en','ar'
Когда выбранное значение 'en','ar'
запрос не работает
Я хочу, чтобы он мог выбирать сообщения, которые либо en
или же ar
IN ('en','ar')
2 ответа
Решение
Вы не можете использовать in
с такими списками. Вы можете сделать это с exists
:
SELECT p.*
FROM `posts` p
WHERE exists (select 1
from `users` u
where u.user_id = ? and find_in_set(p.language, u.possible_languages)
)
Это будет более эффективно, если у вас есть индекс на users(user_id, possible_languages)
,
Может быть более эффективным в качестве объединения
SELECT posts.*
FROM `posts`, `users`
WHERE find_in_set(`language`,`possible_languages`)
AND user_id = ?
Однако более эффективный запрос для этого может быть:
SELECT posts.*
FROM posts,users
WHERE (language=possible_languages OR possible_languages='ar,en')
AND user_id=?
Предполагая, что значения в языке и возможных_языках только такие, как вы указали. В этом случае полезен указатель по языку в постах.