Я работаю в поисковике. У меня есть форма с множественным выбором, которая содержит языки, и в базе данных MySQL у меня есть одна таблица с именем USERS со всеми пользователями, зарегистрированными на веб-сайте, и одна таблица с именем USERS_LANGUAGES с языками, которые пользователи выбрали в своем профиле.
Итак, мне нужен запрос, чтобы получить пользователей, которые говорят на всех языках, выбранных в множественном выборе.
Мой первый вариант был:
SELECT u.id FROM users u INNER JOIN users_languages ul ON u.id=ul.id_user AND ul.id_language IN ($multiselect options separated by comma)
Но этот запрос показывает пользователей, которые знают некоторые из этих языков, а не ВСЕ из них.
Мой второй вариант — сделать цикл и добавить INNER JOIN для каждого языка, например так:
SELECT id FROM users u INNER JOIN users_languages ul_1 ON u.id=ul_1.id_user AND ul_1.id_language = 1 INNER JOIN user_languages ul_2 ON u.id=ul_2.id_user AND ul_2.id_language = 2 ...
этот запрос работает, но мне интересно, есть ли более простой запрос для этого.
Итак, чтобы опираться на комментарий @CBroes:
(Я использовал предложение IN в качестве примера)
SELECT u.id
FROM users u
INNER JOIN users_languages ul
ON u.id=ul.id_user
AND ul.id_language
IN ("English", "Spanish", "French", "German")
HAVING COUNT(distinct ul.id_language) = 4
Итак, как вы сказали, если вы подходите:
("English", "Spanish", "French", "Arabic")
Т.е. арабский язык вместо немецкого, отличное число будет 3, а не 4, следовательно, оно не окажется в вашем наборе результатов.
Таким образом, вы должны каждый раз отправлять число в пункте подсчета.
Других решений пока нет …