2012-06-10 19 views
5

tengo cinco tablas en mi base de datos, usuarios, trabajos, calificaciones, job_qualifications y users_qualificationMySQL, donde todo en

necesito para seleccionar todo el personal que están calificados para llevar a cabo un trabajo en particular. Sería útil si hubo una declaración como TODOS EN así que por ejemplo la consulta sería

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

Solo una idea: para su propósito, ¿no tendría más sentido hacer la comprobación al revés: seleccione las personas cuyas calificaciones laborales son TODAS las calificaciones del usuario? –

Respuesta

6

Si conoce el número de títulos que se requieren para el trabajo, se puede escribir la siguiente consulta:

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} 

para encontrar el número de títulos, ejecute:

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

Necesito asegurarme de que obtenga los usuarios con las calificaciones correctas, no solo la misma cantidad de calificaciones, ¿esto todavía lo logrará? –

+0

@ bland-dan Sí, el 'JOIN' se ocupa de eso –

+0

Simple, elegante - IMPRESIONANTE. He estado buscando durante horas, y esto resolvió mi problema en 10 segundos. Felicitaciones para ti, @TheScrumMeister. –

2

Ampliando la respuesta de la melé Meister, se podría hacer algo como esto:

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

Gracias Alexs +1 para mejorar la respuesta scrumeister –