sql >> Base de Datos >  >> RDS >> Mysql

Cómo unirse tiene muchas tablas de relaciones y obtener resultados por tipo

Usa LEFT JOIN para asegurarnos de que si las tablas de relaciones no tienen ningún dato, todavía podemos tener registros de la tabla principal.

Referencia:Comprender MySQL LEFT JOIN

Problemas :

  • Nombre de campo incorrecto :pr.interview_id = i.interview_id , debería ser pr.interview_id = i.id ya que no tenemos ningún campo id_entrevista en interviews tabla, sería id campo - basado en su consulta.
  • pr.interview_id = i.id en where cláusula :Si participant_rating la tabla no tiene ningún registro para una entrevista dada, esto provocará la eliminación de esa entrevista del conjunto de resultados. Usa LEFT JOIN para participant_rating mesa.
  • sr.interview_id = i.id en where cláusula :Si system_rating la tabla no tiene ningún registro para una entrevista dada, esto provocará la eliminación de esa entrevista del conjunto de resultados. Usa LEFT JOIN para system_rating mesa también.
  • Usage of AVG funciona pero no funcionará para otras funciones de agregados como SUM, COUNT .. porque si tenemos relaciones de uno a muchos, la combinación hará que haya múltiples registros para la misma fila.

Solución :

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