Ще трябва да използвате DISTINCT
, но също така трябва да преброите идентификаторите, а не външните ключове:
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
Ето цигулка .
Обяснение: DISTINCT
ключова дума елиминира всички дублирани стойности, което води до списък с уникални стойности.
Ако изпълните заявката си без COUNT()
и SUM()
, получавате:
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)
Така че, ако добавите COUNT()
и SUM()
, очевидно получавате:
name table1_id table2_id table3_id size test 4 2 2 1224
Въпреки това, използвайки DISTINCT
с вашата заявка няма да помогне, защото можете ясно да видите дублиращите се стойности, което ще доведе до:
name table1_id table2_id table3_id size test 1 1 1 1224
Сега, ако изпълните моята заявка без COUNT()
и SUM()
, получавате:
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)
Ако добавите COUNT()
и SUM()
, получавате абсолютно същите резултати като вашата заявка:
name table1_id table2_id table3_id size test 4 2 2 1224
Въпреки това, тъй като този път имате различни стойности (т.е. не всички са 1), така че сега, ако преброите уникалните стойности с помощта на DISTINCT
, получавате:
name table1_id table2_id table3_id size test 3 1 2 1224