Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL join e COUNT() em várias tabelas


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