Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL join e COUNT() su più tabelle

Dovrai usare DISTINCT , ma devi anche contare gli ID, non le chiavi esterne:

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

Ecco un violino .

Spiegazione: Il DISTINCT parola chiave elimina tutti i valori duplicati risultando in un elenco di valori univoci.

Se esegui la query senza COUNT() e SUM() , ottieni:

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) 

Quindi se aggiungi il COUNT() e SUM() , ovviamente ottieni:

name  table1_id  table2_id  table3_id  size
test  4          2          2          1224 

Tuttavia, utilizzando DISTINCT con la tua query non sarà di aiuto perché puoi vedere chiaramente i valori duplicati, che risulteranno in:

name  table1_id  table2_id  table3_id  size
test  1          1          1          1224 

Ora, se esegui la mia query senza COUNT() e SUM() , ottieni:

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) 

Se aggiungi il COUNT() e SUM() , ottieni esattamente gli stessi risultati della tua query:

name  table1_id  table2_id  table3_id  size
test  4          2          2          1224 

Tuttavia, poiché questa volta hai valori diversi (cioè non tutti sono 1), quindi ora se conti i valori univoci usando DISTINCT , ottieni:

name  table1_id  table2_id  table3_id  size
test  3          1          2          1224