Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Simple left join no me funciona

Estas en el tema de Simple left join no me funciona en el foro de Mysql en Foros del Web. Saludos. Estoy tratando de hacer una consulta con left join, donde: tabla1 (articulo_defecto) tabla2 (detalle_articulo) -------------------articulo_defecto---------------- id_articulo-----num_defecto-----descripcion 1------------------1287------------lata 1------------------1288------------botella 3------------------23-----------detergente 4------------------545-----------pastas 6------------------515-----------pastas 1------------------1289-----------pastas 257----------------255-----------pastas 4------------------5-----------pastas ...
  #1 (permalink)  
Antiguo 14/03/2013, 12:08
Avatar de LuZBinG  
Fecha de Ingreso: enero-2008
Mensajes: 407
Antigüedad: 16 años, 3 meses
Puntos: 5
Simple left join no me funciona

Saludos.
Estoy tratando de hacer una consulta con left join,
donde:
tabla1 (articulo_defecto)
tabla2 (detalle_articulo)

-------------------articulo_defecto----------------
id_articulo-----num_defecto-----descripcion
1------------------1287------------lata
1------------------1288------------botella
3------------------23-----------detergente
4------------------545-----------pastas
6------------------515-----------pastas
1------------------1289-----------pastas
257----------------255-----------pastas
4------------------5-----------pastas
1------------------1290-----------pastas



------------detalle_articulo----------------
id------------num_defecto---------cantidad
234----------------1287--------------0
12------------------1288-------------1
46-----------------1289--------------2
4--------------------5-----------------0
5-------------------515---------------0
6--------------------545--------------0
7--------------------23---------------0
24----------------1287--------------0
1------------------1288-------------1
24----------------1289--------------0
48--------------------5-----------------0
6---------------------23-------------4
23----------------1287--------------0
122------------------1288-------------1
264----------------1289--------------0



Si realizo una consulta simple:
Código PHP:
 select from articulo_defecto where id_articulo='1'
 
obtengolos 4 registros con id_articulo =
El problema es cuando realizo left join de la siguiente forma:
Código PHP:
select detalle_articulo.num_defecto,cantidad from articulo_defecto
left join detalle_articulo on articulo_defecto
.num_defecto detalle_articulo.num_defecto where id_articulo =
se supone que debe de regresarme los 4 registros con id_articulo =1 y ademas el registro que no aparece en la tabla detalle_articulo que es num_defecto=1290

esto es lo que quiero obtener:
num_defecto---------cantidad
1287--------------------0
1288-------------------1
1289-------------------2
(1290--NULL)------------------NULL
1287--------------------0
1288-------------------1
1289-------------------0
(1290--NULL)------------------NULL
1287--------------------0
1288-------------------1
1289-------------------0
(1290--NULL)------------------NULL

Espero haberme explicado

saludos.
__________________
LuZbIng
  #2 (permalink)  
Antiguo 14/03/2013, 12:40
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Simple left join no me funciona

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
  1. mysql> SELECT * FROM articulo_defecto WHERE id_articulo = 1;
  2. +-------------+-------------+-------------+
  3. | id_articulo | num_defecto | descripcion |
  4. +-------------+-------------+-------------+
  5. |           1 |        1287 | lata        |
  6. |           1 |        1288 | botella     |
  7. |           1 |        1289 | pastas      |
  8. |           1 |        1290 | pastas      |
  9. +-------------+-------------+-------------+
  10. 4 rows in set (0.02 sec)

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
  1. mysql> SELECT * FROM detalle_articulo WHERE num_defecto = 1287;
  2. +------+-------------+----------+
  3. | id   | num_defecto | cantidad |
  4. +------+-------------+----------+
  5. |  234 |        1287 |        0 |
  6. |   24 |        1287 |        0 |
  7. |   23 |        1287 |        0 |
  8. +------+-------------+----------+
  9. 3 rows in set (0.00 sec)

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 original
  1. mysql> SELECT A.num_defecto, IFNULL(D.total_cantidad, 0) cantidad
  2.     -> FROM articulo_defecto A
  3.     -> LEFT JOIN
  4.     -> ( SELECT num_defecto, SUM(cantidad) total_cantidad
  5.     ->   FROM detalle_articulo
  6.     ->   GROUP BY num_defecto ) D ON A.num_defecto = D.num_defecto
  7.     -> WHERE A.id_articulo = 1;
  8. +-------------+----------+
  9. | num_defecto | cantidad |
  10. +-------------+----------+
  11. |        1287 |        0 |
  12. |        1288 |        3 |
  13. |        1289 |        2 |
  14. |        1290 |        0 |
  15. +-------------+----------+
  16. 4 rows in set (0.00 sec)

Pero te repito, no sé si este es el resultado que esperas. Dale un vistazo y nos comentas.

Saludos
Leo.
  #3 (permalink)  
Antiguo 14/03/2013, 12:46
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Simple left join no me funciona

Perdón... creo que entendí mal el planteamiento... pero en estos momentos no puedo revisar los datos... dame unos minutos y lo vuelvo a analizar...

Saludos
Leo.
  #4 (permalink)  
Antiguo 14/03/2013, 12:56
Avatar de LuZBinG  
Fecha de Ingreso: enero-2008
Mensajes: 407
Antigüedad: 16 años, 3 meses
Puntos: 5
Respuesta: Simple left join no me funciona

Gracias por responder y saludos.

Cita:
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...
No entendi esta parte, si la relacion es de num_defecto y no por id

saludos.
__________________
LuZbIng
  #5 (permalink)  
Antiguo 14/03/2013, 13:09
Avatar de LuZBinG  
Fecha de Ingreso: enero-2008
Mensajes: 407
Antigüedad: 16 años, 3 meses
Puntos: 5
Respuesta: Simple left join no me funciona

Si no es con left join como podria obtener los datos asi

Cita:
num_defecto---------cantidad
1287--------------------0
1288-------------------1
1289-------------------2
(1290--NULL)------------------NULL
1287--------------------0
1288-------------------1
1289-------------------0
(1290--NULL)------------------NULL
1287--------------------0
1288-------------------1
1289-------------------0
(1290--NULL)------------------NULL
__________________
LuZbIng
  #6 (permalink)  
Antiguo 14/03/2013, 13:11
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Simple left join no me funciona

Hola de nuevo LuZBinG:

Creo que efectivamente, entendí mal el enunciado del problema, y te dí una respuesta que no era, pero creo que tampoco termino de entender lo que necesitas .

Vayamos por partes... partiendo de esta consulta:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM articulo_defecto WHERE id_articulo = 1;
  2. +-------------+-------------+-------------+
  3. | id_articulo | num_defecto | descripcion |
  4. +-------------+-------------+-------------+
  5. |           1 |        1287 | lata        |
  6. |           1 |        1288 | botella     |
  7. |           1 |        1289 | pastas      |
  8. |           1 |        1290 | pastas      |
  9. +-------------+-------------+-------------+
  10. 4 rows IN SET (0.02 sec)

Observamos que para el artículo 1 existen 4 num_defecto (1287, 1288, 1289, 1290). Hasta aquí creo que no tenemos problemas... Ahora bien, si analizamos tu tabla detalle_articulo para estos num_defectos tenemos esto:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM detalle_articulo
  2.     -> WHERE num_defecto IN (1287, 1288, 1289, 1290)
  3.     -> ORDER BY num_defecto;
  4. +------+-------------+----------+
  5. | id   | num_defecto | cantidad |
  6. +------+-------------+----------+
  7. |  234 |        1287 |        0 |
  8. |   24 |        1287 |        0 |
  9. |   23 |        1287 |        0 |
  10. |   12 |        1288 |        1 |
  11. |    1 |        1288 |        1 |
  12. |  122 |        1288 |        1 |
  13. |   46 |        1289 |        2 |
  14. |   24 |        1289 |        0 |
  15. |  264 |        1289 |        0 |
  16. +------+-------------+----------+
  17. 9 rows in set (0.00 sec)

Es decir, aparecen 9 registros debido a que NO EXISTE NINGÚN DEFECTO PARA EL num_defecto = 1290 mi pregunta es, ¿Por qué pretendes regresar 12 registros como resultado final? por qué el resultado para el num_defecto = 1290 se debe repetir tres veces?

La consulta que pones te regresa 10 registros, es decir LOS NUEVE QUE CORRESPONDEN A LOS num_defecto que si existen MAS 1 REGISTRO NULL PARA INDICAR QUE NO EXISTE ningún registro para el num_defecto = 1290:

Código MySQL:
Ver original
  1. mysql> SELECT articulo_defecto.num_defecto, detalle_articulo.cantidad
  2.     -> FROM articulo_defecto
  3.     -> LEFT JOIN
  4.     -> detalle_articulo
  5.     -> ON articulo_defecto.num_defecto = detalle_articulo.num_defecto
  6.     -> WHERE articulo_defecto.id_articulo = 1;
  7. +-------------+----------+
  8. | num_defecto | cantidad |
  9. +-------------+----------+
  10. |        1287 |        0 |
  11. |        1287 |        0 |
  12. |        1287 |        0 |
  13. |        1288 |        1 |
  14. |        1288 |        1 |
  15. |        1288 |        1 |
  16. |        1289 |        2 |
  17. |        1289 |        0 |
  18. |        1289 |        0 |
  19. |        1290 |     NULL |
  20. +-------------+----------+
  21. 10 rows in set (0.00 sec)

¿¿¿Es esto lo que pretendes??? que el registro NULL aparezca tres veces en lugar de 1??? en base a qué criterio???

Saludos
Leo.
  #7 (permalink)  
Antiguo 14/03/2013, 13:20
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Simple left join no me funciona

Volviendo al principio, te destaco una cosa
Cita:
se supone que debe de regresarme los 4 registros con id_articulo =1 y ademas el registro que no aparece en la tabla detalle_articulo que es num_defecto=1290
Eso es técnicamente imposible, porque LEFT JOIN toma la tabla izquierda de base de la consulta, y como en esa tabla no existe el num_defecto, simplemente no aparecerá...
En otras palabras, refrendando lo dicho por Leo, eso no se puede obtener en base a las tablas de datos que quieres usar. No cumplen los criterios necesarios (y francamente, no se entiende en qué consiste el reporte)
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 14/03/2013, 13:27
Avatar de LuZBinG  
Fecha de Ingreso: enero-2008
Mensajes: 407
Antigüedad: 16 años, 3 meses
Puntos: 5
Respuesta: Simple left join no me funciona

Gracias por contestar .
pero ni si quiera el ultimo registro NULL puedo optener.

Cita:
¿¿¿Es esto lo que pretendes??? que el registro NULL aparezca tres veces en lugar de 1??? en base a qué criterio???
Si se podria si!!!!
pero si no ni modo saludos y gracias.
__________________
LuZbIng
  #9 (permalink)  
Antiguo 14/03/2013, 13:32
Avatar de LuZBinG  
Fecha de Ingreso: enero-2008
Mensajes: 407
Antigüedad: 16 años, 3 meses
Puntos: 5
Respuesta: Simple left join no me funciona

Gracias gnzsoloyo
Cita:
Eso es técnicamente imposible, porque LEFT JOIN toma la tabla izquierda de base de la consulta, y como en esa tabla no existe el num_defecto, simplemente no aparecerá...
__________________
LuZbIng
  #10 (permalink)  
Antiguo 14/03/2013, 14:43
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Simple left join no me funciona

El problema es que no termino de entender qué lógica sigue el reporte que quieres general , igual y si comienzas por explicarnos con palabras, más que con los datos cómo es que quieres llegar a ese reporte podríamos darte alguna alternativa... Ni siquiera entiendo cómo tienes ordenados los datos... tienes datos idénticos

Código MySQL:
Ver original
  1. mysql> SELECT * FROM detalle_articulo WHERE num_defecto = 1287;
  2. +------+-------------+----------+
  3. | id   | num_defecto | cantidad |
  4. +------+-------------+----------+
  5. |  234 |        1287 |        0 |
  6. |   24 |        1287 |        0 |
  7. |   23 |        1287 |        0 |
  8. +------+-------------+----------+
  9. 3 rows IN SET (0.00 sec)

En tu reporte final a qué registro correspondería cada una de ellos??? qué pasaría por ejemplo si en lugar de tres registros para el num_defecto = 1287 hubiera 1 o 2??? cómo se debería presentar el reporte final???

Afortunadamente hay muchas técnicas en SQL para hacer cosas, no solo JOIN's... UNION's, productos cartesianos etc. Si todo esto falla, pues podías hacer uso de Procedimientos almacenados, pero para eso es necesario que quede claro qué es lo que quieres hacer.

Saludos
Leo

Etiquetas: join, left, registros, select, simple, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:12.