Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment joindre a de nombreuses tables de relations et récupérer le résultat par type

Utilisez LEFT JOIN pour s'assurer que si les tables de relations n'ont pas de données, nous pouvons toujours avoir des enregistrements de la table principale.

Référence :Comprendre MySQL LEFT JOIN

Problème(s) :

  • Nom de champ incorrect :pr.interview_id = i.interview_id , il devrait être pr.interview_id = i.id car nous n'avons pas de champ interview_id dans interviews table, ce serait id champ - en fonction de votre requête.
  • pr.interview_id = i.id dans where clause :Si participant_rating table ne contient aucun enregistrement pour une interview donnée, cela entraînera la suppression de cette interview de l'ensemble de résultats. Utilisez LEFT JOIN pour participant_rating tableau.
  • sr.interview_id = i.id dans where clause :Si system_rating table ne contient aucun enregistrement pour une interview donnée, cela entraînera la suppression de cette interview de l'ensemble de résultats. Utilisez LEFT JOIN pour system_rating table aussi.
  • Usage of AVG fonctionne mais ne fonctionnera pas pour d'autres fonctions d'agrégation comme SUM, COUNT .. parce que si nous avons des relations un à plusieurs, la jointure fera qu'il y aura plusieurs enregistrements pour la même ligne.

Solution :

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