2012-06-10 18 views
5

Mam pięć tabel w mojej bazy danych, użytkowników, pracy, kwalifikacji, job_qualifications i users_qualificationMySQL gdzie wszystko w

muszę zaznaczyć, że wszyscy pracownicy są kwalifikacje do wykonywania określonej pracy. Warto byłoby gdyby nie było stwierdzenie, takie jak ALL IN tak na przykład kwerenda byłoby

SELECT user_id 
FROM users_qualification 
WHERE qualification_id ALL IN 
    (
     SELECT qualification_id 
     FROM job_qualifications 
     WHERE jobs_id = 1 
    ) 
+0

Po prostu myśl: dla własnego celu, czy nie ma większego sensu sprawdzanie odwrotności: wybierz ludzi, którzy mają kwalifikacje zawodowe CAŁKOWICIE w kwalifikacjach użytkownika? –

Odpowiedz

6

Jeśli znasz numer kwalifikacji, które są wymagane do pracy, można napisać to zapytanie:

SELECT uq.user_id 
FROM users_qualification uq JOIN job_qualifications jq 
    ON uq.qualification_id = jq.qualification_id 
WHERE jq.jobs_id = 1 
GROUP BY uq.user_id 
HAVING COUNT(*) = {# of qualifications} 

Aby znaleźć numer kwalifikacji, uruchom:

SELECT COUNT(*) 
FROM job_qualifications 
WHERE jq.jobs_id = 1 
+0

Muszę zapewnić, że otrzymam użytkowników z odpowiednimi kwalifikacjami, a nie tylko taką samą liczbą kwalifikacji, czy to jeszcze pozwoli? –

+0

@ bland-dan Tak, 'JOIN' zajmuje się tym –

+0

Proste, eleganckie - NIESAMOWITE. Szukałem wiele godzin, a to rozwiązało mój problem za 10 sekund. Czapki z głów dla ciebie @ TheScrumMeister. –

2

Rozwijając na odpowiedź scrum Meister jest, można zrobić coś takiego:

SELECT 
    distinct uq.user_id 
FROM 
    users_qualification uq 
    JOIN job_qualifications jq ON uq.qualification_id = jq.qualification_id 
WHERE 
    jq.jobs_id = 1 
GROUP 
    BY uq.user_id 
HAVING 
    COUNT(*) = (SELECT COUNT(*) FROM job_qualifications jq2 WHERE jq2.job_id = jq.job_id) 
+0

Dzięki Alexs +1 za zwiększenie odpowiedzi na scrumpera –