Brug LEFT JOIN for at sikre, at hvis relationstabeller ikke har nogen data, kan vi stadig have poster fra hovedtabellen.
Reference:Forstå MySQL LEFT JOIN
Problem(er) :
- Forkert feltnavn :
pr.interview_id = i.interview_id, skal det værepr.interview_id = i.idda vi ikke har noget interview_id felt iinterviewstabel, ville det væreidfelt - baseret på din forespørgsel. pr.interview_id = i.idiwhereklausul :Hvisparticipant_ratingtabel ikke har nogen registreringer for et givet interview, vil dette medføre, at det pågældende interview fjernes fra resultatsættet. BrugLEFT JOINforparticipant_ratingtabel.sr.interview_id = i.idiwhereklausul :Hvissystem_ratingtabel ikke har nogen registreringer for et givet interview, vil dette medføre, at det pågældende interview fjernes fra resultatsættet. BrugLEFT JOINforsystem_ratingogså bord.Usage of AVGvirker, men virker ikke for andre aggregatfunktioner somSUM, COUNT.. fordi hvis vi har et til mange forhold, så vil join bevirke, at der vil være flere poster for den samme række.
Løsning :
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