Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como juntar tem muitas tabelas de relações e buscar resultado por tipo


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 ser pr.interview_id = i.id pois não temos nenhum campo entrevista_id em interviews tabela, seria id campo - com base em sua consulta.
  • pr.interview_id = i.id em where cláusula :Se participant_rating tabela não tiver nenhum registro para uma determinada entrevista, isso causará a remoção dessa entrevista do conjunto de resultados. Use LEFT JOIN para participant_rating tabela.
  • sr.interview_id = i.id em where cláusula :Se system_rating tabela não tiver nenhum registro para uma determinada entrevista, isso causará a remoção dessa entrevista do conjunto de resultados. Use LEFT JOIN para system_rating mesa também.
  • Usage of AVG funciona, mas não funcionará para outras funções agregadas como SUM, 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