Gebruik LEFT JOIN
om er zeker van te zijn dat als relatietabellen geen gegevens hebben, we toch records uit de hoofdtabel kunnen hebben.
Referentie:MySQL LEFT JOIN begrijpen
Probleem(en) :
- Onjuiste veldnaam :
pr.interview_id = i.interview_id
, het moetpr.interview_id = i.id
. zijn omdat we geen interview_id-veld hebben ininterviews
tabel, zou hetid
. zijn veld - gebaseerd op uw zoekopdracht. pr.interview_id = i.id
inwhere
clausule :Alsparticipant_rating
tabel geen records heeft voor een bepaald interview, zal dit ertoe leiden dat dat interview uit de resultatenset wordt verwijderd. GebruikLEFT JOIN
voorparticipant_rating
tafel.sr.interview_id = i.id
inwhere
clausule :Alssystem_rating
tabel geen records heeft voor een bepaald interview, zal dit ertoe leiden dat dat interview uit de resultatenset wordt verwijderd. GebruikLEFT JOIN
voorsystem_rating
tafel ook.Usage of AVG
werkt maar werkt niet voor andere aggregatiefuncties zoalsSUM, COUNT
.. want als we een te veel relaties hebben, dan zorgt join ervoor dat er meerdere records voor dezelfde rij zijn.
Oplossing :
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