Hola LuZBinG:
El resultado es perfectamente normal, por lo que tu problema está en la información, no en la consulta, veamos.
La consulta que pones:
Código MySQL:
Ver original+-------------+-------------+-------------+
| id_articulo | num_defecto | descripcion |
+-------------+-------------+-------------+
| 1 | 1287 | lata |
| 1 | 1288 | botella |
| 1 | 1289 | pastas |
| 1 | 1290 | pastas |
+-------------+-------------+-------------+
Efectivamente te regresa 4 registros, pero observa los num_defectos... para el caso del num_defecto 1287, EXISTEN TRES REGISTROS QUE CUMPLEN CON LA CONDICIÓN ON DEL JOIN:
Código MySQL:
Ver original+------+-------------+----------+
| id | num_defecto | cantidad |
+------+-------------+----------+
| 234 | 1287 | 0 |
| 24 | 1287 | 0 |
| 23 | 1287 | 0 |
+------+-------------+----------+
Cada uno de estos tiene un ID distinto... lo mismo para los otros num_defectos.
Si la relación entre tus tablas fuera de 0 a 1 (es decir, pudiera existir y si existe sólo existe una vez) entonces si, el resultado del LEFT JOIN deberían ser también 4 registros, no más...
Aquí hay de dos sopas... o te falta algún otro criterio en el ON o lo que puedes hacer es CONSOLIDAR (sumar) tus registros en la tabla detalle_articulo para que sólo arroje un resultado por num_defecto, es decir, algo como esto:
Código MySQL:
Ver originalmysql
> SELECT A.num_defecto
, IFNULL(D.total_cantidad
, 0) cantidad
-> FROM articulo_defecto A
-> ( SELECT num_defecto
, SUM(cantidad
) total_cantidad
-> GROUP BY num_defecto
) D
ON A.num_defecto
= D.num_defecto
-> WHERE A.id_articulo
= 1; +-------------+----------+
| num_defecto | cantidad |
+-------------+----------+
| 1287 | 0 |
| 1288 | 3 |
| 1289 | 2 |
| 1290 | 0 |
+-------------+----------+
Pero te repito, no sé si este es el resultado que esperas. Dale un vistazo y nos comentas.
Saludos
Leo.