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.idvì chúng tôi không có bất kỳ trường phỏng vấn_id nào tronginterviewsbảng, nó sẽ làid- dựa trên truy vấn của bạn. -
pr.interview_id = i.idởwheremệnh đề :Nếuparticipant_ratingbả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 JOINchoparticipant_ratingbảng. -
sr.interview_id = i.idởwheremệnh đề :Nếusystem_ratingbả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 JOINchosystem_ratingcả bảng. -
Usage of AVGhoạ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