Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie man beitritt, hat viele Beziehungstabellen und ruft das Ergebnis nach Typ ab

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 sollte pr.interview_id = i.id sein da wir in interviews kein interview_id-Feld haben Tabelle, es wäre id Feld - basierend auf Ihrer Anfrage.
  • pr.interview_id = i.id in where Klausel :Wenn participant_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 Sie LEFT JOIN für participant_rating Tabelle.
  • sr.interview_id = i.id in where Klausel :Wenn system_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 Sie LEFT JOIN für system_rating Tisch auch.
  • Usage of AVG funktioniert, funktioniert aber nicht für andere Aggregatfunktionen wie SUM, 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