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 êtrepr.interview_id = i.id
car nous n'avons pas de champ interview_id dansinterviews
table, ce seraitid
champ - en fonction de votre requête. pr.interview_id = i.id
danswhere
clause :Siparticipant_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. UtilisezLEFT JOIN
pourparticipant_rating
tableau.sr.interview_id = i.id
danswhere
clause :Sisystem_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. UtilisezLEFT JOIN
poursystem_rating
table aussi.Usage of AVG
fonctionne mais ne fonctionnera pas pour d'autres fonctions d'agrégation commeSUM, 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