Będziesz musiał użyć DISTINCT
, ale musisz też policzyć identyfikatory, a nie klucze obce:
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
Oto skrzypce .
Wyjaśnienie: DISTINCT
słowo kluczowe eliminuje wszystkie zduplikowane wartości, czego wynikiem jest lista unikalnych wartości.
Jeśli uruchomisz zapytanie bez COUNT()
i SUM()
, otrzymujesz:
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)
Więc jeśli dodasz COUNT()
i SUM()
, oczywiście otrzymujesz:
name table1_id table2_id table3_id size test 4 2 2 1224
Jednak używając DISTINCT
z zapytaniem nie pomoże, ponieważ wyraźnie widać zduplikowane wartości, co spowoduje:
name table1_id table2_id table3_id size test 1 1 1 1224
Teraz, jeśli uruchomisz moje zapytanie bez COUNT()
i SUM()
, otrzymujesz:
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)
Jeśli dodasz COUNT()
i SUM()
, otrzymujesz dokładnie takie same wyniki jak Twoje zapytanie:
name table1_id table2_id table3_id size test 4 2 2 1224
Ponieważ jednak tym razem masz różne wartości (tzn. nie wszystkie są 1), więc teraz, jeśli policzysz unikalne wartości za pomocą DISTINCT
, otrzymujesz:
name table1_id table2_id table3_id size test 3 1 2 1224