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.idprotože vinterviewsnemáme žádné pole interview_id tabulka, bude toidpole – na základě vašeho dotazu. pr.interview_id = i.idvwheredoložka :Pokudparticipant_ratingtabulka nemá žádné záznamy pro daný rozhovor, způsobí to odstranění tohoto rozhovoru ze sady výsledků. PoužijteLEFT JOINproparticipant_ratingstůl.sr.interview_id = i.idvwheredoložka :Pokudsystem_ratingtabulka nemá žádné záznamy pro daný rozhovor, způsobí to odstranění tohoto rozhovoru ze sady výsledků. PoužijteLEFT JOINprosystem_ratingstůl také.Usage of AVGfunguje, 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