Użyj LEFT JOIN
aby upewnić się, że tabele relacji nie zawierają żadnych danych, nadal możemy mieć rekordy z tabeli głównej.
Odniesienie:Zrozumienie MySQL LEFT JOIN
Problemy :
- Niewłaściwa nazwa pola :
pr.interview_id = i.interview_id
, powinno byćpr.interview_id = i.id
ponieważ nie mamy żadnego pola interview_id winterviews
tabeli, byłoby toid
pole - na podstawie Twojego zapytania. pr.interview_id = i.id
wwhere
klauzula :Jeśliparticipant_rating
tabela nie posiada rekordów dla danego wywiadu, spowoduje to usunięcie tego wywiadu ze zbioru wyników. UżyjLEFT JOIN
dlaparticipant_rating
stół.sr.interview_id = i.id
wwhere
klauzula :Jeślisystem_rating
tabela nie posiada rekordów dla danego wywiadu, spowoduje to usunięcie tego wywiadu ze zbioru wyników. UżyjLEFT JOIN
dlasystem_rating
stół też.Usage of AVG
działa, ale nie działa w przypadku innych funkcji agregujących, takich jakSUM, COUNT
.. ponieważ jeśli mamy jeden do wielu relacji, to join sprawi, że będzie wiele rekordów dla tego samego wiersza.
Rozwiązanie :
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