sql >> Databasteknik >  >> RDS >> Mysql

MySQL join och COUNT() på flera tabeller

Du måste använda DISTINCT , men du måste också räkna ID:n, inte främmande nycklar:

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

Här är en fiol .

Förklaring: DISTINCT nyckelord eliminerar alla dubbletter av värden vilket resulterar i en lista med unika värden.

Om du kör din fråga utan COUNT() och SUM() , du får:

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) 

Så om du lägger till COUNT() och SUM() , du får uppenbarligen:

name  table1_id  table2_id  table3_id  size
test  4          2          2          1224 

Använder dock DISTINCT med din fråga hjälper det inte eftersom du tydligt kan se dubblettvärdena, vilket kommer att resultera i:

name  table1_id  table2_id  table3_id  size
test  1          1          1          1224 

Nu, om du kör min fråga utan COUNT() och SUM() , du får:

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) 

Om du lägger till COUNT() och SUM() , får du exakt samma resultat som din fråga:

name  table1_id  table2_id  table3_id  size
test  4          2          2          1224 

Men eftersom du den här gången har olika värden (dvs alla är inte 1), så nu om du räknar de unika värdena med DISTINCT , du får:

name  table1_id  table2_id  table3_id  size
test  3          1          2          1224 


  1. UnsupportedOperationException med DriverManager.getConnection() på Android

  2. Hur man automatiserar migrering från fristående MySQL till Galera Cluster med Ansible

  3. Oracle-bulkimport

  4. Skrivskyddad routing för en alltid på