Sử dụng LEFT JOIN
để đảm bảo nếu các bảng quan hệ không có bất kỳ dữ liệu nào, chúng ta vẫn có thể có các bản ghi từ bảng chính.
Tham khảo: Hiểu MySQL THAM GIA TRÁI
(Các) vấn đề :
- Tên trường sai :
pr.interview_id = i.interview_id
, nó phải làpr.interview_id = i.id
vì chúng tôi không có bất kỳ trường phỏng vấn_id nào tronginterviews
bảng, nó sẽ làid
- dựa trên truy vấn của bạn. -
pr.interview_id = i.id
ởwhere
mệnh đề :Nếuparticipant_rating
bảng không có bất kỳ bản ghi nào cho một cuộc phỏng vấn nhất định, điều này sẽ khiến cuộc phỏng vấn đó bị xóa khỏi tập hợp kết quả. Sử dụngLEFT JOIN
choparticipant_rating
bảng. -
sr.interview_id = i.id
ởwhere
mệnh đề :Nếusystem_rating
bảng không có bất kỳ bản ghi nào cho một cuộc phỏng vấn nhất định, điều này sẽ khiến cuộc phỏng vấn đó bị xóa khỏi tập hợp kết quả. Sử dụngLEFT JOIN
chosystem_rating
cả bảng. -
Usage of AVG
hoạt động nhưng sẽ không hoạt động đối với các hàm tổng hợp khác nhưSUM, COUNT
.. bởi vì nếu chúng ta có một đến nhiều mối quan hệ thì việc nối sẽ làm cho sẽ có nhiều bản ghi cho cùng một hàng.
Giải pháp :
SELECT
i.id AS interview_id,
i.candidate,
AVG(sr.rating) AS system_rating,
AVG(CASE WHEN pr.rater_type = 'Candidate' THEN pr.rating END) AS candidate_rating,
AVG(CASE WHEN pr.rater_type = 'Recruiter' THEN pr.rating END) AS recruiter_rating
FROM interviews i
LEFT JOIN system_rating sr ON sr.interview_id = i.id
LEFT JOIN participant_rating pr ON pr.interview_id = i.id
-- WHERE i.id IN (1, 2, 3) -- use whenever required
GROUP BY i.id