Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-Join und COUNT() für mehrere Tabellen

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