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