2012-06-10 54 views
5

Tôi có năm bảng trong cơ sở dữ liệu của tôi, người sử dụng, việc làm, trình độ, job_qualifications và users_qualificationMySQL nơi tất cả trong

tôi cần phải chọn tất cả các nhân viên có đủ điều kiện để thực hiện một công việc cụ thể. Nó sẽ là hữu ích nếu có một tuyên bố như ALL IN ví dụ như vậy truy vấn sẽ là

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

Chỉ cần một ý nghĩ: cho mục đích của bạn, nó sẽ không có ý nghĩa hơn để làm kiểm tra theo cách khác xung quanh: chọn những người mà trình độ công việc là trình độ ALL IN của người dùng? –

Trả lời

6

Nếu bạn biết số lượng bằng cấp được yêu cầu cho công việc, bạn có thể viết truy vấn này:

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} 

Để tìm số lượng bằng cấp, chạy:

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

Tôi cần đảm bảo rằng tôi có được người dùng có trình độ phù hợp, không chỉ cùng một số bằng cấp, liệu điều này vẫn đạt được điều đó? –

+0

@ bland-dan Có, 'JOIN' sẽ quan tâm đến điều đó –

+0

Đơn giản, thanh lịch - TUYỆT VỜI. Tôi đã tìm kiếm hàng giờ và điều này đã giải quyết được vấn đề của tôi sau 10 giây. Đội mũ cho bạn, @ TheScrumMeister. –

2

Mở rộng trên Câu trả lời của Scrum Meister, bạn có thể làm một cái gì đó như thế này:

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

Cảm ơn Alexs +1 vì đã tăng cường câu trả lời cho người trả lời –

Các vấn đề liên quan