Du måste använda DISTINCT
, men du måste också räkna ID:n, inte främmande nycklar:
SELECT
table1.name,
COUNT(DISTINCT table2.id) AS table2_count,
COUNT(DISTINCT table3.id) AS table3_count,
COUNT(DISTINCT table4.id) AS table4_count,
SUM(table4.size) AS table4_size
FROM table1
LEFT JOIN table2 ON table1.id = table2.table1_id
LEFT JOIN table3 ON table2.id = table3.table2_id
LEFT JOIN table4 ON table3.id = table4.table3_id
WHERE table1.id = 1
Här är en fiol .
Förklaring: DISTINCT
nyckelord eliminerar alla dubbletter av värden vilket resulterar i en lista med unika värden.
Om du kör din fråga utan COUNT()
och SUM()
, du får:
name table1_id table2_id table3_id size test 1 1 1 1024 test 1 1 1 200 test 1 (null) (null) (null) test 1 (null) (null) (null)
Så om du lägger till COUNT()
och SUM()
, du får uppenbarligen:
name table1_id table2_id table3_id size test 4 2 2 1224
Använder dock DISTINCT
med din fråga hjälper det inte eftersom du tydligt kan se dubblettvärdena, vilket kommer att resultera i:
name table1_id table2_id table3_id size test 1 1 1 1224
Nu, om du kör min fråga utan COUNT()
och SUM()
, du får:
name table1_id table2_id table3_id size test 1 1 1 1024 test 1 1 2 200 test 2 (null) (null) (null) test 3 (null) (null) (null)
Om du lägger till COUNT()
och SUM()
, får du exakt samma resultat som din fråga:
name table1_id table2_id table3_id size test 4 2 2 1224
Men eftersom du den här gången har olika värden (dvs alla är inte 1), så nu om du räknar de unika värdena med DISTINCT
, du får:
name table1_id table2_id table3_id size test 3 1 2 1224