Verwenden Sie LEFT JOIN um sicherzustellen, dass wir, wenn Beziehungstabellen keine Daten enthalten, trotzdem Datensätze aus der Haupttabelle haben können.
Referenz:Mysql LEFT JOIN verstehen
Problem(e) :
- Falscher Feldname :
pr.interview_id = i.interview_id, es solltepr.interview_id = i.idsein da wir ininterviewskein interview_id-Feld haben Tabelle, es wäreidFeld - basierend auf Ihrer Anfrage. pr.interview_id = i.idinwhereKlausel :Wennparticipant_ratingTabelle keine Datensätze für ein bestimmtes Interview enthält, führt dies dazu, dass dieses Interview aus der Ergebnismenge entfernt wird. Verwenden SieLEFT JOINfürparticipant_ratingTabelle.sr.interview_id = i.idinwhereKlausel :Wennsystem_ratingTabelle keine Datensätze für ein bestimmtes Interview enthält, führt dies dazu, dass dieses Interview aus der Ergebnismenge entfernt wird. Verwenden SieLEFT JOINfürsystem_ratingTisch auch.Usage of AVGfunktioniert, funktioniert aber nicht für andere Aggregatfunktionen wieSUM, COUNT.. denn wenn wir eine zu viele Beziehungen haben, führt Join dazu, dass es mehrere Datensätze für dieselbe Zeile gibt.
Lösung :
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