sql >> Database >  >> RDS >> Mysql

Hoe lid te worden heeft veel relatietabel en haal het resultaat op per type

Gebruik LEFT JOIN om er zeker van te zijn dat als relatietabellen geen gegevens hebben, we toch records uit de hoofdtabel kunnen hebben.

Referentie:MySQL LEFT JOIN begrijpen

Probleem(en) :

  • Onjuiste veldnaam :pr.interview_id = i.interview_id , het moet pr.interview_id = i.id . zijn omdat we geen interview_id-veld hebben in interviews tabel, zou het id . zijn veld - gebaseerd op uw zoekopdracht.
  • pr.interview_id = i.id in where clausule :Als participant_rating tabel geen records heeft voor een bepaald interview, zal dit ertoe leiden dat dat interview uit de resultatenset wordt verwijderd. Gebruik LEFT JOIN voor participant_rating tafel.
  • sr.interview_id = i.id in where clausule :Als system_rating tabel geen records heeft voor een bepaald interview, zal dit ertoe leiden dat dat interview uit de resultatenset wordt verwijderd. Gebruik LEFT JOIN voor system_rating tafel ook.
  • Usage of AVG werkt maar werkt niet voor andere aggregatiefuncties zoals SUM, COUNT .. want als we een te veel relaties hebben, dan zorgt join ervoor dat er meerdere records voor dezelfde rij zijn.

Oplossing :

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



  1. ActiveAndroid Pre-tabel vullen met schemamigratie

  2. MySQL optimaliseren voor ALTER TABLE van InnoDB

  3. Fout #1241 - Operand moet 1 kolom(men) bevatten in Mysql

  4. Vermijd filesort met INNER JOIN + ORDER BY