Sie müssen DISTINCT
verwenden , aber Sie müssen auch die IDs zählen, nicht die Fremdschlüssel:
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
Hier ist eine Geige .
Erklärung: Der DISTINCT
Schlüsselwort eliminiert alle doppelten Werte, was zu einer Liste eindeutiger Werte führt.
Wenn Sie Ihre Abfrage ohne COUNT()
ausführen und SUM()
, erhalten Sie:
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)
Wenn Sie also den COUNT()
hinzufügen und SUM()
, erhalten Sie offensichtlich:
name table1_id table2_id table3_id size test 4 2 2 1224
Allerdings mit DISTINCT
mit Ihrer Abfrage wird nicht helfen, weil Sie die doppelten Werte deutlich sehen können, was zu Folgendem führt:
name table1_id table2_id table3_id size test 1 1 1 1224
Nun, wenn Sie meine Abfrage ohne COUNT()
ausführen und SUM()
, erhalten Sie:
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)
Wenn Sie den COUNT()
hinzufügen und SUM()
, erhalten Sie genau die gleichen Ergebnisse wie Ihre Abfrage:
name table1_id table2_id table3_id size test 4 2 2 1224
Da Sie diesmal jedoch andere Werte haben (d. h. nicht alle sind 1), zählen Sie jetzt die eindeutigen Werte mit DISTINCT
, erhalten Sie:
name table1_id table2_id table3_id size test 3 1 2 1224