Use
LEFT JOIN para ter certeza se as tabelas de relação não possuem dados, ainda podemos ter registros da tabela principal. Referência:Compreendendo MySQL LEFT JOIN
Problemas :
- Nome de campo incorreto :
pr.interview_id = i.interview_id, deve serpr.interview_id = i.idpois não temos nenhum campo entrevista_id eminterviewstabela, seriaidcampo - com base em sua consulta. pr.interview_id = i.idemwherecláusula :Separticipant_ratingtabela não tiver nenhum registro para uma determinada entrevista, isso causará a remoção dessa entrevista do conjunto de resultados. UseLEFT JOINparaparticipant_ratingtabela.sr.interview_id = i.idemwherecláusula :Sesystem_ratingtabela não tiver nenhum registro para uma determinada entrevista, isso causará a remoção dessa entrevista do conjunto de resultados. UseLEFT JOINparasystem_ratingmesa também.Usage of AVGfunciona, mas não funcionará para outras funções agregadas comoSUM, COUNT.. porque se tivermos um para muitos relacionamentos, a junção fará com que haja vários registros para a mesma linha.
Solução :
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