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

[SOLUCIONADO] Problemas Con GROUP BY

Estas en el tema de Problemas Con GROUP BY en el foro de Mysql en Foros del Web. Hola Amigos!!! necesito si alguien me puede ayudar a resolver este tema estoy relacionando varias tablas por un id ,pero en 2 tablas el id ...
  #1 (permalink)  
Antiguo 25/02/2013, 06:40
 
Fecha de Ingreso: octubre-2010
Ubicación: Buenos Aires
Mensajes: 557
Antigüedad: 13 años, 6 meses
Puntos: 4
Problemas Con GROUP BY

Hola Amigos!!!
necesito si alguien me puede ayudar a resolver este tema
estoy relacionando varias tablas por un id ,pero en 2 tablas el id puede aparecer varias veces , entonces los estoy agrupando por este mismo id,pero mis resultados no son lo que espero
pongo la consulta
Código MySQL:
Ver original
  1. SELECT P.*,GROUP_CONCAT(A.presu_artiid)AS arti_id,
  2. GROUP_CONCAT(A.presu_bundle)AS bundle,
  3. GROUP_CONCAT(A.presu_manual)AS manual,
  4. A.presu2_id,
  5. GROUP_CONCAT(B.prodbun_artiid)AS bundlearti_id,
  6. GROUP_CONCAT(B.prodbun_cantidad)AS bundle_cantidad,
  7. B.prodbun_tipo,B.prodbun_numero,B.prodbun_id
  8. FROM presupuestos P
  9. INNER JOIN presupuestos2 A ON P.presu_id=A.presu2_id
  10. LEFT OUTER JOIN prod_bundle B ON P.presu_id=B.prodbun_numero AND B.prodbun_tipo=0 AND A.presu_artiid=B.prodbun_id
  11. WHERE  P.presu_id =1
  12.  GROUP BY A.presu2_id,B.prodbun_id
arti_id esto:
5,7,49,49,1361710188

en la tabla prod_bundle el registro 49 esta insertado 2 veces en el campo prodbun_id ,por eso tambien lo agrupe pero sigue apareciendo 2 veces
Gracias por cualquier ayuda que me puedan brindar
Saludos
  #2 (permalink)  
Antiguo 25/02/2013, 06:46
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, 4 meses
Puntos: 2658
Respuesta: Problemas Con GROUP BY

GROUP_CONCAT agrupa en una sola cadena todo lo que encuentre, en cada registro que se agrupe, por lo que no hace distinciones de distintos a menos que específicamente se lo indiques:
Código MySQL:
Ver original
  1.     P.*,
  2.     GROUP_CONCAT(DISTINCT A.presu_artiid) arti_id,
  3.     GROUP_CONCAT(DISTINCT A.presu_bundle) bundle,
  4.     GROUP_CONCAT(DISTINCT A.presu_manual) manual,
  5.     A.presu2_id,
  6.     GROUP_CONCAT(DISTINCT B.prodbun_artiid) bundlearti_id,
  7.     GROUP_CONCAT(DISTINCT B.prodbun_cantidad) bundle_cantidad,
  8.     B.prodbun_tipo,
  9.     B.prodbun_numero,
  10.     B.prodbun_id
  11. FROM presupuestos P
  12.     INNER JOIN presupuestos2 A ON P.presu_id=A.presu2_id
  13.     LEFT JOIN prod_bundle B ON P.presu_id = B.prodbun_numero AND B.prodbun_tipo=0 AND A.presu_artiid = B.prodbun_id
  14.     P.presu_id =1
  15.     A.presu2_id, B.prodbun_id
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 25/02/2013, 06:52
 
Fecha de Ingreso: octubre-2010
Ubicación: Buenos Aires
Mensajes: 557
Antigüedad: 13 años, 6 meses
Puntos: 4
Respuesta: Problemas Con GROUP BY

Gracias gnzsoloyo
me olvide mencionar que ya habia probado de esa forma y el resultado es por un lado
5,7,1361710188 y por otro 49,49
y el resultado que busco es 5,7,49,1361710188
  #4 (permalink)  
Antiguo 25/02/2013, 07:03
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, 4 meses
Puntos: 2658
Respuesta: Problemas Con GROUP BY

Vamos a necesitar una muestra dela estructura de tablas y de los INSERT de datos del caso para poder entender bien por qué.

Por lo poronto, explicanos un poco mejor qué representa cada tabla, y qué es lo que se supone que quieres conseguir.
También cuál es el sentido del LEFT JOIN, que es una cláusula que tiene a generar resultados erróneos con facilidad.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 25/02/2013, 07:27
 
Fecha de Ingreso: octubre-2010
Ubicación: Buenos Aires
Mensajes: 557
Antigüedad: 13 años, 6 meses
Puntos: 4
Respuesta: Problemas Con GROUP BY

OK gracias nuevamente
con respecto a a LEFT JOIN es porque en la tabla prod_bundle puede no existir el registro
que busco y tengo entendido que si hago INNER JOIN y no lo encuentra, tampoco me va a traer los registros de la tabla presuestos
pongo la consulta completa y la estructura
Código MySQL:
Ver original
  1. SELECT P.*,GROUP_CONCAT(A.presu_artiid)AS arti_id,
  2.                                         GROUP_CONCAT(B.prodbun_artiid)AS bundlearti_id,
  3.                                         GROUP_CONCAT(B.prodbun_cantidad)AS bundle_cantidad,
  4.                                    
  5.                                         B.prodbun_tipo,B.prodbun_numero,B.prodbun_id
  6.                                        
  7.                                       FROM presupuestos P
  8.                                      
  9.                                       INNER JOIN presupuestos2 A ON P.presu_id=A.presu2_id
  10.                                       LEFT JOIN prod_bundle B ON P.presu_id=B.prodbun_numero AND B.prodbun_tipo=0 AND A.presu_artiid=B.prodbun_id
  11.                                      
  12.                                            WHERE  P.presu_eliminado=0  AND P.presu_id =1
  13.                                            GROUP BY A.presu2_id,B.prodbun_id";
Código MySQL:
Ver original
  1. CREATE TABLE `presupuestos` (
  2.   `presu_id` int(11) NOT NULL auto_increment,
  3.   `presu_clienteid` int(11) NOT NULL,
  4.   `presu_lista` int(11) NOT NULL,
  5.   `presu_tipo` int(11) NOT NULL,
  6.   `presu_moneda` int(2) NOT NULL,
  7.   `presu_vendedor` int(11) NOT NULL,
  8.   `presu_usuario` varchar(100) NOT NULL,
  9.   `presu_suc` varchar(10) NOT NULL,
  10.   `presu_monecoti` int(11) NOT NULL,
  11.   `presu_coti` decimal(6,4) NOT NULL,
  12.   `presu_fecha` date NOT NULL,
  13.   `presu_fecharece` date NOT NULL,
  14.   `presu_hora` time NOT NULL,
  15.   `presu_eliminado` int(2) NOT NULL,
  16.   `presu_pedido` int(11) NOT NULL,
  17.   `presu_obser` text NOT NULL,
  18.   `presu_envio` int(11) NOT NULL,
  19.   `presu_envioprecio` decimal(15,4) NOT NULL,
  20.   `presu_modiven` varchar(100) NOT NULL,
  21.   `presu_modifecha` date NOT NULL,
  22.   `presu_modihora` time NOT NULL,
  23.   `presu_descuento` int(11) NOT NULL,
  24.   `presu_pordescuento` decimal(7,4) NOT NULL,
  25.   `presu_finaldescuento` decimal(15,4) NOT NULL,
  26.   `presu_eliusuario` varchar(100) NOT NULL,
  27.   `presu_elifecha` date NOT NULL,
  28.   `presu_elihora` time NOT NULL,
  29.   `presu_total` decimal(15,4) NOT NULL,
  30.   `presu_validez` int(11) NOT NULL,
  31.   `presu_tarjeta` text NOT NULL,
  32.   PRIMARY KEY  (`presu_id`)
  33.  
  34.  
  35. INSERT INTO `presupuestos` VALUES (1, 1, 2, 11, 6, 1, '6', '001', 7, 5.0600, '2013-02-24', '2013-02-24', '09:50:00', 0, 0, '', 1, 0.0000, '0', '0000-00-00', '00:00:00', 1, 10.0000, 192.0913, '0', '0000-00-00', '00:00:00', 1728.8213, 180, '');
Código MySQL:
Ver original
  1. CREATE TABLE `presupuestos2` (
  2.   `presu2_id` int(11) NOT NULL,
  3.   `presu_artiid` int(11) NOT NULL,
  4.   `presu_cantidad` int(11) NOT NULL,
  5.   `presu_porcentaje` decimal(15,4) NOT NULL,
  6.   `presu_pororiginal` decimal(15,4) NOT NULL,
  7.   `presu_precio` decimal(15,4) NOT NULL,
  8.   `presu_tipoiva` int(11) NOT NULL,
  9.   `presu_ivadetalle` varchar(10) NOT NULL,
  10.   `presu_iva` decimal(15,4) NOT NULL,
  11.   `presu_subtotal` decimal(15,4) NOT NULL,
  12.   `presu_bundle` int(1) NOT NULL,
  13.   `presu_manual` int(1) NOT NULL,
  14.   KEY `presu2_id` (`presu2_id`)
  15.  
  16.  
  17.  
  18. INSERT INTO `presupuestos2` VALUES (1, 5, 1, 26.0000, 40.0000, 15.2460, 1, '21.0000', 2.6460, 12.6000, 0, 0);
  19. INSERT INTO `presupuestos2` VALUES (1, 7, 10, 34.9999, 49.9999, 113.2238, 3, '10.5000', 10.7588, 1024.6496, 0, 0);
  20. INSERT INTO `presupuestos2` VALUES (1, 49, 1, 62.0000, 80.0000, 446.3375, 1, '21.0000', 77.4635, 368.8740, 1, 0);
  21. INSERT INTO `presupuestos2` VALUES (1, 1361710188, 10, 11.5702, 23.9669, 13.5000, 1, '21.0000', 2.3430, 111.5702, 0, 1);
Código MySQL:
Ver original
  1. CREATE TABLE `prod_bundle` (
  2.   `prodbun_tipo` int(1) NOT NULL,
  3.   `prodbun_numero` int(11) NOT NULL,
  4.   `prodbun_id` int(11) NOT NULL,
  5.   `prodbun_artiid` int(11) NOT NULL,
  6.   `prodbun_cantidad` int(11) NOT NULL,
  7.   KEY `presu3_id` (`prodbun_numero`),
  8.   KEY `presubundle_id` (`prodbun_id`)
  9.  
  10.  
  11. INSERT INTO `prod_bundle` VALUES (0, 1, 49, 5, 1);
  12. INSERT INTO `prod_bundle` VALUES (0, 1, 49, 7, 2);
GRACIAS!!!
  #6 (permalink)  
Antiguo 25/02/2013, 08:05
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, 4 meses
Puntos: 2658
Respuesta: Problemas Con GROUP BY

En definitiva, parece un tema de incorrecto agrupamiento.
Para poder lograr que el resultado sea "5,7,49,1361710188", debes agrupar por "presu2_id", pero como lo estás haciendo también por "prodbun_id", eso genera una discriminación del agrupamiento que no cumple con lo que necesitas, porque ese campo tiene dos valores diferentes para el mismo "presu2_id".

La consulta que puede devolverte lo que quieres es:
Código SQL:
Ver original
  1. SELECT
  2.     P.*,
  3.     GROUP_CONCAT(DISTINCT A.presu_artiid)AS arti_id,
  4.     GROUP_CONCAT(DISTINCT B.prodbun_artiid)AS bundlearti_id,
  5.     GROUP_CONCAT(DISTINCT B.prodbun_cantidad)AS bundle_cantidad,
  6.     B.prodbun_tipo,B.prodbun_numero,B.prodbun_id
  7. FROM presupuestos P
  8.     INNER JOIN presupuestos2 A ON P.presu_id=A.presu2_id
  9.     LEFT JOIN prod_bundle B ON P.presu_id=B.prodbun_numero AND B.prodbun_tipo=0 AND A.presu_artiid=B.prodbun_id
  10. WHERE  P.presu_eliminado=0  AND P.presu_id =1
  11. GROUP BY A.presu2_id;

Supongo que eso es lo que buscas. de lo contrario hay que revisar las condiciones de agrupamiento que usas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 25/02/2013, 08:24
 
Fecha de Ingreso: octubre-2010
Ubicación: Buenos Aires
Mensajes: 557
Antigüedad: 13 años, 6 meses
Puntos: 4
Respuesta: Problemas Con GROUP BY

Gracias por seguir con mi problema
de esta forma "GROUP BY A.presu2_id"
el resultado es "5,7,49,49,1361710188"
esta agregando un "49" que ya no me quedan ideas de como solucionarlo
pensandolo bien podria no hacer la consulta a
Código MySQL:
Ver original
  1. LEFT JOIN prod_bundle B ON P.presu_id=B.prodbun_numero AND B.prodbun_tipo=0 AND A.presu_artiid=B.prodbun_id
y llamarla despues en otra consulta
pero si lo puedo hacer desde esta misma consulta seria lo mejor
existe algo mas que podria hacer?
Gracias!!!
  #8 (permalink)  
Antiguo 25/02/2013, 09:10
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, 4 meses
Puntos: 2658
Respuesta: Problemas Con GROUP BY

¿Estás seguro de estar usando lo que yo te postee?
Mira, te paso la captura de consola de lo que yo ejecuté, y voy a suprimir solamente las columnas innecesarias:
Código MySQL:
Ver original
  1. mysql> SELECT
  2.     ->     GROUP_CONCAT(DISTINCT A.presu_artiid)AS arti_id,
  3.     ->     GROUP_CONCAT(DISTINCT B.prodbun_artiid)AS bundlearti_id,
  4.     ->     GROUP_CONCAT(DISTINCT B.prodbun_cantidad)AS bundle_cantidad,
  5.     ->     B.prodbun_tipo,B.prodbun_numero,B.prodbun_id
  6.     -> FROM presupuestos P
  7.     ->     INNER JOIN presupuestos2 A ON P.presu_id=A.presu2_id
  8.     ->     LEFT JOIN prod_bundle B ON P.presu_id=B.prodbun_numero AND B.prodbun_tipo=0 AND A.presu_artiid=B.prodbun_id
  9.     -> WHERE  P.presu_eliminado=0  AND P.presu_id =1
  10.     -> GROUP BY A.presu2_id;
  11. +-------------------+---------------+-----------------+--------------+----------------+------------+
  12. | arti_id           | bundlearti_id | bundle_cantidad | prodbun_tipo | prodbun_numero | prodbun_id |
  13. +-------------------+---------------+-----------------+--------------+----------------+------------+
  14. | 5,7,49,1361710188 | 5,7           | 1,2             |         NULL |           NULL |       NULL |
  15. +-------------------+---------------+-----------------+--------------+----------------+------------+
  16. 1 row in set (0.00 sec)
Como puedes ver, no repite datos, en tanto el gROUP_CONCAT() tenga el DISTINCT...
Estoy usando tu propio esquema y datos pasados.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 25/02/2013, 09:19
 
Fecha de Ingreso: octubre-2010
Ubicación: Buenos Aires
Mensajes: 557
Antigüedad: 13 años, 6 meses
Puntos: 4
Respuesta: Problemas Con GROUP BY

perdon , perdon , perdon
Ahora si tema solucionado
Saludos y muchas gracias por darme siempre una mano!!!
  #10 (permalink)  
Antiguo 25/02/2013, 10:00
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, 4 meses
Puntos: 2658
Respuesta: Problemas Con GROUP BY

No problem.

__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: group, insert, join, resultados, select, 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 02:24.