Você precisará usar
DISTINCT
, mas também você precisa contar os IDs, não as chaves estrangeiras: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
Aqui está um violino .
Explicação: O
DISTINCT
palavra-chave elimina todos os valores duplicados resultando em uma lista de valores únicos. Se você executar sua consulta sem o
COUNT()
e SUM()
, você obtém: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)
Então, se você adicionar o
COUNT()
e SUM()
, você obviamente obtém:name table1_id table2_id table3_id size test 4 2 2 1224
No entanto, usando
DISTINCT
com sua consulta não ajudará porque você pode ver claramente os valores duplicados, o que resultará em:name table1_id table2_id table3_id size test 1 1 1 1224
Agora, se você executar minha consulta sem o
COUNT()
e SUM()
, você obtém: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 você adicionar o
COUNT()
e SUM()
, você obtém exatamente os mesmos resultados da sua consulta:name table1_id table2_id table3_id size test 4 2 2 1224
No entanto, como desta vez você tem valores diferentes (ou seja, nem todos são 1), então agora se você contar os valores únicos usando
DISTINCT
, você obtém:name table1_id table2_id table3_id size test 3 1 2 1224