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.id
sein da wir ininterviews
kein interview_id-Feld haben Tabelle, es wäreid
Feld - basierend auf Ihrer Anfrage. pr.interview_id = i.id
inwhere
Klausel :Wennparticipant_rating
Tabelle keine Datensätze für ein bestimmtes Interview enthält, führt dies dazu, dass dieses Interview aus der Ergebnismenge entfernt wird. Verwenden SieLEFT JOIN
fürparticipant_rating
Tabelle.sr.interview_id = i.id
inwhere
Klausel :Wennsystem_rating
Tabelle keine Datensätze für ein bestimmtes Interview enthält, führt dies dazu, dass dieses Interview aus der Ergebnismenge entfernt wird. Verwenden SieLEFT JOIN
fürsystem_rating
Tisch auch.Usage of AVG
funktioniert, 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