Použijte LEFT JOIN
abychom se ujistili, že relační tabulky neobsahují žádná data, stále můžeme mít záznamy z hlavní tabulky.
Reference:Porozumění MySQL LEFT JOIN
Problém(y) :
- Chybný název pole :
pr.interview_id = i.interview_id
, mělo by to býtpr.interview_id = i.id
protože vinterviews
nemáme žádné pole interview_id tabulka, bude toid
pole – na základě vašeho dotazu. pr.interview_id = i.id
vwhere
doložka :Pokudparticipant_rating
tabulka nemá žádné záznamy pro daný rozhovor, způsobí to odstranění tohoto rozhovoru ze sady výsledků. PoužijteLEFT JOIN
proparticipant_rating
stůl.sr.interview_id = i.id
vwhere
doložka :Pokudsystem_rating
tabulka nemá žádné záznamy pro daný rozhovor, způsobí to odstranění tohoto rozhovoru ze sady výsledků. PoužijteLEFT JOIN
prosystem_rating
stůl také.Usage of AVG
funguje, ale nebude fungovat pro jiné agregační funkce jakoSUM, COUNT
.. protože pokud máme jeden až mnoho vztahů, pak spojení způsobí, že pro stejný řádek bude více záznamů.
Řešení :
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