Запрос для SELECT всех пользователей, которые говорят на всех указанных языках - PullRequest
2 голосов
/ 19 мая 2011

У меня есть таблица, у нас есть имена пользователей и языки, на которых они могут говорить. только две колонки, ИД пользователя и язык.

Я хочу найти всех тех пользователей, которые могут говорить на хинди, английском, немецком и французском языках. Как мне написать этот запрос? Я не могу использовать Inner Join 4 раза. Возможно, проблема в том, что проверка количества языков может увеличиться, возможно, я захочу проверить больше языков.

идентификатор пользователя | язык
1 | английский
4 | английский
1 | французский
1 | немецкий
.................

Ответы [ 4 ]

8 голосов
/ 19 мая 2011

Если вы используете MySQL, вы можете сделать что-то вроде (для отладки, не для тестирования):

SELECT userid FROM (
    SELECT userid, GROUP_CONCAT(language SEPARATOR ',') AS languages
    FROM UserLanguage 
    ORDER BY userid ASC, language ASC 
    GROUP BY userid)
WHERE languages LIKE '%english%french%german%hindi%';

(языки в предложении LIKE должны быть отсортированы)

Как использовать GROUP BY для объединения строк в MySQL?


Или, может быть, быстрее:

SELECT userid 
FROM UserLanguage 
WHERE language IN ('fr', 'en, 'de', 'hi') 
GROUP BY userid 
HAVING COUNT(DISTINCT(language)) >= 4
1 голос
/ 19 мая 2011

Вы можете использовать подзапрос:

SELECT userid
FROM (
    SELECT userid, COUNT(*) AS cnt
    FROM mytable
    WHERE language IN ('hindi','german','french','english')
    GROUP BY userid
) AS t
WHERE cnt = 4;
0 голосов
/ 23 мая 2011

Я думаю, что если у вас нет количества и названия языка, вам следует попробовать следующий запрос ...

select userid 
from UserLanguage 
group by userid 
having count(language)= (select count(distinct language) from userid)
0 голосов
/ 19 мая 2011

Вы можете использовать коррелированный подзапрос , например:

SELECT UserId
FROM UserLanguage UL1
WHERE
    EXISTS (SELECT * FROM UserLanguage UL2 WHERE UL2.UserId = UL1.UserId
        AND UL2.Language = 'english') AND
    EXISTS (SELECT * FROM UserLanguage UL2 WHERE UL2.UserId = UL1.UserId
        AND UL2.Language = 'hindi') AND
    EXISTS (SELECT * FROM UserLanguage UL2 WHERE UL2.UserId = UL1.UserId
        AND UL2.Language = 'german') AND
    EXISTS (SELECT * FROM UserLanguage UL2 WHERE UL2.UserId = UL1.UserId
        AND UL2.Language = 'french')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...