Оператор 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=?

Предполагая, что значения в языке и возможных_языках только такие, как вы указали. В этом случае полезен указатель по языку в постах.

Другие вопросы по тегам