Mysql
 sql >> Database >  >> RDS >> Mysql

Come unirsi ha molte tabelle di relazione e recupera i risultati per tipo

Usa LEFT JOIN per assicurarci che le tabelle di relazione non abbiano dati, possiamo comunque avere record dalla tabella principale.

Riferimento:Capire MySQL LEFT JOIN

Problemi :

  • Nome campo errato :pr.interview_id = i.interview_id , dovrebbe essere pr.interview_id = i.id poiché non abbiamo alcun campo interview_id in interviews tabella, sarebbe id campo - in base alla tua richiesta.
  • pr.interview_id = i.id in where clausola :Se participant_rating la tabella non ha alcun record per una determinata intervista, ciò comporterà la rimozione di tale intervista dal set di risultati. Usa LEFT JOIN per participant_rating tabella.
  • sr.interview_id = i.id in where clausola :Se system_rating la tabella non ha alcun record per una determinata intervista, ciò comporterà la rimozione di tale intervista dal set di risultati. Usa LEFT JOIN per system_rating anche tavolo.
  • Usage of AVG funziona ma non funzionerà per altre funzioni aggregate come SUM, COUNT .. perché se abbiamo da una a molte relazioni, join farà sì che ci saranno più record per la stessa riga.

Soluzione :

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