Използвайте LEFT JOIN
за да сме сигурни, че таблиците на релациите нямат никакви данни, все пак можем да имаме записи от основната таблица.
Справка:Разбиране на MySQL LEFT JOIN
Проблем(и) :
- Грешно име на поле :
pr.interview_id = i.interview_id
, трябва да бъдеpr.interview_id = i.id
тъй като нямаме поле interview_id вinterviews
таблица, това ще бъдеid
поле - въз основа на вашата заявка. pr.interview_id = i.id
вwhere
клаузата :Акоparticipant_rating
таблицата няма записи за дадено интервю, това ще доведе до премахването на това интервю от набора от резултати. ИзползвайтеLEFT JOIN
заparticipant_rating
маса.sr.interview_id = i.id
вwhere
клаузата :Акоsystem_rating
таблицата няма записи за дадено интервю, това ще доведе до премахването на това интервю от набора от резултати. ИзползвайтеLEFT JOIN
заsystem_rating
маса също.Usage of AVG
работи, но няма да работи за други агрегатни функции катоSUM, COUNT
.. защото ако имаме една към много връзки, тогава присъединяването ще направи, че ще има множество записи за един и същи ред.
Решение :
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