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

LEFT JOIN con posibles múltiples resultados a la parte derecha

Estas en el tema de LEFT JOIN con posibles múltiples resultados a la parte derecha en el foro de Mysql en Foros del Web. Hola: Tengo una duda, y es la siguiente: Tengo dos tablas, A y B, y quiero sacar los resultados en base a la tabla A ...
  #1 (permalink)  
Antiguo 30/05/2012, 06:32
 
Fecha de Ingreso: diciembre-2011
Mensajes: 35
Antigüedad: 12 años, 4 meses
Puntos: 2
LEFT JOIN con posibles múltiples resultados a la parte derecha

Hola:

Tengo una duda, y es la siguiente:

Tengo dos tablas, A y B, y quiero sacar los resultados en base a la tabla A con un LEFT JOIN con la B. El problema es que si hay más de un resultado en la tabla B solamente me va a mostrar uno y no los 2 ó 3 que pueda haber porque la que predomina es la A.

Si alguien supiera como hacerlo lo agradecería enormemente :)
  #2 (permalink)  
Antiguo 30/05/2012, 07:03
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: LEFT JOIN con posibles múltiples resultados a la parte derecha

Hola jalde:

¿A qué te refieres con que sólo mostraría un registro de la tablaB?... si la condición se cumple debe mostrar todos los registros, no solo uno de ellos. Sería conveniente que nos pusieras algunos datos de ejemplo de tus tablas para entender mejor tu problema, pues creo que no ha quedado muy claro.

Saludos
Leo.
  #3 (permalink)  
Antiguo 30/05/2012, 07:18
 
Fecha de Ingreso: diciembre-2011
Mensajes: 35
Antigüedad: 12 años, 4 meses
Puntos: 2
Respuesta: LEFT JOIN con posibles múltiples resultados a la parte derecha

Hola leonardo_josue:


Vale, acabo de ver que el problema no venía de ahí. He creado unas tablas de prueba y ha salido como quería que saliese.


La cuestión es que en LEFT JOIN solamente me sale un único resultado por la parte derecha del JOIN. Voy a echar un vistazo porque entonces el problema es otro.


Muchas gracias por tu tiempo!
  #4 (permalink)  
Antiguo 30/05/2012, 07:26
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: LEFT JOIN con posibles múltiples resultados a la parte derecha

Tal y como lo explicas creo que deberias repasar los apuntes sobre los modificadores de JOIN

Pongamos ejemplos

Código pre:
Ver original
  1. TablaA
  2. idA         Nombre
  3. 1          Pepito
  4.  
  5. TablaB
  6. idB       Nombre    idA
  7. --         --              --

(Nada en la tabla B)

SELECT *
FROM TablaA a INNER JOIN tablaB b
ON a.idA=b.idB

Resultado
Código pre:
Ver original
  1. idA         Nombre   idB       Nombre

Nada

SELECT *
FROM TablaA a LEFT JOIN tablaB b
ON a.idA=b.idB


Código pre:
Ver original
  1. idA         Nombre   idB       Nombre  
  2. 1            Pepito     --         --


Código pre:
Ver original
  1. TablaA
  2. idA         Nombre
  3. 1          Pepito
  4. 2          Pepita
  5. TablaB
  6. idB       Nombre       idA
  7. 1          Palotes         1
  8. 2          Fernandez    1

SELECT *
FROM TablaA a INNER JOIN tablaB b
ON a.idA=b.idB

Resultado
Código pre:
Ver original
  1. idA         Nombre   idB       Nombre        
  2. 1            Pepito     1          Palotes        
  3. 1            Pepito     2          Feranadez



SELECT *
FROM TablaA a LEFT JOIN tablaB b
ON a.idA=b.idB


Código pre:
Ver original
  1. idA         Nombre   idB       Nombre        
  2. 1            Pepito     1          Palotes        
  3. 1            Pepito     2          Feranadez    
  4. 2            Pepita     --         --

He sido lento al escribir... no estaba tu segundo post quando he empezado.
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #5 (permalink)  
Antiguo 30/05/2012, 07:32
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: LEFT JOIN con posibles múltiples resultados a la parte derecha

Hola de nuevo...

Sigues sin ponernos datos de ejemplo y así será difícil tratar de ayudarte... un error típico al utilizar LEFT JOIN'S colocar adecuadamente las condiciones para filtrar la información... hay que identificar qué condiciones puedes colocar en la sección ON de JOIN y qué condiciones poner en el WHERE, acabo de contestar otro post en donde aplico este detalle, imagina que tienes dos tablas así:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tablaA;
  2. +------+-------------+
  3. | id   | campo_texto |
  4. +------+-------------+
  5. |    1 | Texto aaaa  |
  6. |    2 | Texto bbbb  |
  7. |    3 | Texto cccc  |
  8. |    4 | Texto dddd  |
  9. |    5 | Texto eeee  |
  10. +------+-------------+
  11. 5 rows in set (0.00 sec)
  12.  
  13. mysql> SELECT * FROM tablaB;
  14. +------+------------+------------+
  15. | id   | id_tabla_A | id_usuario |
  16. +------+------------+------------+
  17. |    1 |          2 |          1 |
  18. |    2 |          3 |          1 |
  19. |    3 |          4 |          2 |
  20. |    4 |          2 |          3 |
  21. |    5 |          3 |          3 |
  22. |    6 |          5 |          1 |
  23. +------+------------+------------+
  24. 6 rows in set (0.00 sec)

el resultado que quieres obtener sería la tablaA más una columna que indique si el texto está asignado al usuario 3, es decir algo como esto:

Código MySQL:
Ver original
  1. +------+-------------+-----------+
  2. | id   | campo_texto | postulado |
  3. +------+-------------+-----------+
  4. |    1 | Texto aaaa  | false     |
  5. |    2 | Texto bbbb  | true      |
  6. |    3 | Texto cccc  | true      |
  7. |    4 | Texto dddd  | false     |
  8. |    5 | Texto eeee  | false     |
  9. +------+-------------+-----------+

Por lo tanto debes colocar un filtro para el usuario, pero observa el comportamiento si se coloca en el ON o en el WHERE:


Código MySQL:
Ver original
  1. mysql> SELECT tablaA.id, tablaA.campo_texto,
  2.     -> IF(tablaB.id IS NULL, 'false', 'true') postulado
  3.     -> FROM tablaA
  4.     -> LEFT JOIN tablaB ON TablaA.id = tablaB.id_tabla_a
  5.     -> WHERE tablaB.id_usuario = 3;
  6. +------+-------------+-----------+
  7. | id   | campo_texto | postulado |
  8. +------+-------------+-----------+
  9. |    2 | Texto bbbb  | true      |
  10. |    3 | Texto cccc  | true      |
  11. +------+-------------+-----------+
  12. 2 rows in set (0.00 sec)
  13.  
  14. mysql> SELECT tablaA.id, tablaA.campo_texto,
  15.     -> IF(tablaB.id IS NULL, 'false', 'true') postulado
  16.     -> FROM tablaA
  17.     -> LEFT JOIN tablaB ON TablaA.id = tablaB.id_tabla_a
  18.     -> AND tablaB.id_usuario = 3;
  19. +------+-------------+-----------+
  20. | id   | campo_texto | postulado |
  21. +------+-------------+-----------+
  22. |    1 | Texto aaaa  | false     |
  23. |    2 | Texto bbbb  | true      |
  24. |    3 | Texto cccc  | true      |
  25. |    4 | Texto dddd  | false     |
  26. |    5 | Texto eeee  | false     |
  27. +------+-------------+-----------+
  28. 5 rows in set (0.00 sec)

Esto mismo puede estar ocurriendo en tu caso, aunque insisto, sin datos de ejemplo sólo estoy tratando de adivinar.

Saludos
Leo.
  #6 (permalink)  
Antiguo 31/05/2012, 07:30
 
Fecha de Ingreso: diciembre-2011
Mensajes: 35
Antigüedad: 12 años, 4 meses
Puntos: 2
Respuesta: LEFT JOIN con posibles múltiples resultados a la parte derecha

Vaya! Agradezco un montón vuestro trabajo. La cuestión es que los LEFT JOINs estaban claros en un principio pero había algo que no me cuadraba al salirme un resultado de la tabla en la parte derecha. Tal y como he dicho arriba, el problema como tal no existía puesto que había un GROUP BY que no estaba teniendo en cuenta. Ha sido partir la consulta en dos (otra solución habría sido demasiado compleja porque eran unas 10-12 tablas) y tema solucionado.

De nuevo, muchas gracias por vuestro tiempo! Me lo guardo por si me hiciera falta en el futuro. :)

Etiquetas: join, left, múltiple, resultados
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 07:36.