Mysql
 sql >> Base de données >  >> RDS >> Mysql

Jointure MySQL et COUNT() sur plusieurs tables

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