sql >> Databáze >  >> RDS >> Mysql

Jak se připojit má mnoho tabulek vztahů a načtení výsledku podle typu

Použijte LEFT JOIN abychom se ujistili, že relační tabulky neobsahují žádná data, stále můžeme mít záznamy z hlavní tabulky.

Reference:Porozumění MySQL LEFT JOIN

Problém(y) :

  • Chybný název pole :pr.interview_id = i.interview_id , mělo by to být pr.interview_id = i.id protože v interviews nemáme žádné pole interview_id tabulka, bude to id pole – na základě vašeho dotazu.
  • pr.interview_id = i.id v where doložka :Pokud participant_rating tabulka nemá žádné záznamy pro daný rozhovor, způsobí to odstranění tohoto rozhovoru ze sady výsledků. Použijte LEFT JOIN pro participant_rating stůl.
  • sr.interview_id = i.id v where doložka :Pokud system_rating tabulka nemá žádné záznamy pro daný rozhovor, způsobí to odstranění tohoto rozhovoru ze sady výsledků. Použijte LEFT JOIN pro system_rating stůl také.
  • Usage of AVG funguje, ale nebude fungovat pro jiné agregační funkce jako SUM, COUNT .. protože pokud máme jeden až mnoho vztahů, pak spojení způsobí, že pro stejný řádek bude více záznamů.

Řešení :

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. Jak získat velikosti tabulek databáze MySQL?

  2. Existuje MySQL ekvivalent k PostgreSQL array_to_string

  3. Apache - Služba MySQL zjištěna s nesprávnou cestou. / Porty se již používají

  4. MySQL - Cizí klíč v kaskádě mazání - Je definováno pořadí provádění?