Vous devrez utiliser DISTINCT
, mais vous devez également compter les identifiants, pas les clés étrangères :
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
Voici un violon .
Explication : Le DISTINCT
le mot clé élimine toutes les valeurs en double, ce qui donne une liste de valeurs uniques.
Si vous exécutez votre requête sans le COUNT()
et SUM()
, vous obtenez :
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)
Donc, si vous ajoutez le COUNT()
et SUM()
, vous obtenez évidemment :
name table1_id table2_id table3_id size test 4 2 2 1224
Cependant, en utilisant DISTINCT
avec votre requête n'aidera pas car vous pouvez voir clairement les valeurs en double, ce qui entraînera :
name table1_id table2_id table3_id size test 1 1 1 1224
Maintenant, si vous exécutez ma requête sans le COUNT()
et SUM()
, vous obtenez :
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)
Si vous ajoutez le COUNT()
et SUM()
, vous obtenez exactement les mêmes résultats que votre requête :
name table1_id table2_id table3_id size test 4 2 2 1224
Cependant, parce que cette fois vous avez des valeurs différentes (c'est-à-dire que toutes ne sont pas 1), alors maintenant si vous comptez les valeurs uniques en utilisant DISTINCT
, vous obtenez :
name table1_id table2_id table3_id size test 3 1 2 1224