Deberá usar DISTINCT
, pero también necesita contar los ID, no las claves foráneas:
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
Aquí hay un fiddle .
Explicación: El DISTINCT
palabra clave elimina todos los valores duplicados dando como resultado una lista de valores únicos.
Si ejecuta su consulta sin COUNT()
y SUM()
, obtienes:
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)
Entonces, si agrega el COUNT()
y SUM()
, obviamente obtienes:
name table1_id table2_id table3_id size test 4 2 2 1224
Sin embargo, usando DISTINCT
con su consulta no ayudará porque puede ver claramente los valores duplicados, lo que dará como resultado:
name table1_id table2_id table3_id size test 1 1 1 1224
Ahora, si ejecuta mi consulta sin COUNT()
y SUM()
, obtienes:
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)
Si agrega el COUNT()
y SUM()
, obtendrá exactamente los mismos resultados que su consulta:
name table1_id table2_id table3_id size test 4 2 2 1224
Sin embargo, debido a que esta vez tiene valores diferentes (es decir, no todos son 1), ahora si cuenta los valores únicos usando DISTINCT
, obtienes:
name table1_id table2_id table3_id size test 3 1 2 1224