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

[SOLUCIONADO] agrupar consulta y mostrar el id mayor del group by

Estas en el tema de agrupar consulta y mostrar el id mayor del group by en el foro de Mysql en Foros del Web. holQue tal, buen día... quisiera saber si me pueden ayudar en esta consulta: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código MySQL: Ver original SELECT Catalogo_Producto_Id AS ID , Nombre ...
  #1 (permalink)  
Antiguo 15/07/2013, 12:01
Avatar de tanliz  
Fecha de Ingreso: abril-2013
Ubicación: Irapuato
Mensajes: 63
Antigüedad: 11 años, 7 meses
Puntos: 1
agrupar consulta y mostrar el id mayor del group by

holQue tal, buen día... quisiera saber si me pueden ayudar en esta consulta:

Código MySQL:
Ver original
  1. SELECT Catalogo_Producto_Id AS ID, Nombre, Modelo, Precio
  2. FROM catalogo_productos
  3. WHERE Tipo_Producto='Control de Acceso'
  4. AND Estatus_Salida='No'
  5. GROUP BY Modelo
  6. ORDER BY Nombre;

La consulta esta bien, me muestra los datos correctos, el unico 'pero'
es que cuando agrupa me muestra siempre el primer ID o el menr Y yo quiero que me muestre el mayor,
como puedo hacerlo?, disculpen mi ignorancia...
  #2 (permalink)  
Antiguo 15/07/2013, 12:07
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: agrupar consulta y mostrar el id mayor del group by

Caso clásico. Se ha preguntado y respondido varias veces en el foro.
Se produce por la forma en que se ejecuta en MySQL el GROUP BY.
Código MySQL:
Ver original
  1. SELECT   ID, nombre, modelo, precio
  2.     FROM (SELECT   Catalogo_Producto_Id ID, Nombre, Modelo, Precio
  3.               FROM catalogo_productos
  4.              WHERE Tipo_Producto = 'Control de Acceso'
  5.                AND Estatus_Salida = 'No'
  6.           ORDER BY Nombre) t1
  7. GROUP BY Modelo;
__________________
¿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 15/07/2013, 12:13
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: agrupar consulta y mostrar el id mayor del group by

Hola tanliz:

como lo comentó gnzsoloyo, este tipo de consultas se ha tratado muchas veces en el foro...

Otra forma de obtener el resultado que quieres:

Código MySQL:
Ver original
  1. SELECT Catalogo_Producto_Id ID, Nombre, Modelo, Precio
  2. FROM catalogo_productos T1
  3. (   SELECT Modelo, max(Catalogo_Producto_Id) max_id
  4.     FROM catalogo_productos
  5.    WHERE Tipo_Producto='Control de Acceso'
  6.    AND Estatus_Salida='No'
  7.    GROUP BY Modelo
  8. ) T2 ON T1.Modelo = T2.Modelo AND
  9.   T1.Catalogo_Producto_Id = T2.max_id
  10. ORDER BY Nombre;

Saludos
Leo.
  #4 (permalink)  
Antiguo 15/07/2013, 12:23
Avatar de tanliz  
Fecha de Ingreso: abril-2013
Ubicación: Irapuato
Mensajes: 63
Antigüedad: 11 años, 7 meses
Puntos: 1
Respuesta: agrupar consulta y mostrar el id mayor del group by

Hola chicos! muchas gracias por responder.... he probado sus sugerencias pero no funcionan, la sugerencia de gnzsoloyo me arroja el mismo resultado (me sigue mostrando el id menor) y la sugerencia de leonardo josue me muestra un error de ambigüedad en el campo Modelo.. :(
  #5 (permalink)  
Antiguo 15/07/2013, 12:29
Avatar de tanliz  
Fecha de Ingreso: abril-2013
Ubicación: Irapuato
Mensajes: 63
Antigüedad: 11 años, 7 meses
Puntos: 1
Respuesta: agrupar consulta y mostrar el id mayor del group by

Si lo hago de esta manera si me muestra el mayor:

Código MySQL:
Ver original
  1. SELECT   ID, nombre, modelo, precio
  2.     FROM (SELECT   Catalogo_Producto_Id ID, Nombre, Modelo, Precio
  3.               FROM catalogo_productos
  4.              WHERE Tipo_Producto = 'cctv'
  5.                AND Estatus_Salida = 'No'
  6.           ORDER BY catalogo_producto_id DESC) t1
  7. GROUP BY Modelo;

pero no me ordena alfabeticamente los productos, alguna otra sugerencia?
  #6 (permalink)  
Antiguo 15/07/2013, 12:30
Avatar de tanliz  
Fecha de Ingreso: abril-2013
Ubicación: Irapuato
Mensajes: 63
Antigüedad: 11 años, 7 meses
Puntos: 1
Respuesta: agrupar consulta y mostrar el id mayor del group by

Ya quedó! agregué otro order by... muchas gracias chicos!
  #7 (permalink)  
Antiguo 15/07/2013, 15:28
Avatar de tanliz  
Fecha de Ingreso: abril-2013
Ubicación: Irapuato
Mensajes: 63
Antigüedad: 11 años, 7 meses
Puntos: 1
Respuesta: agrupar consulta y mostrar el id mayor del group by

Hola de nuevo, vuelvo a solicitar de su ayuda, ahora tengo un problema con esta consulta:


Código MySQL:
Ver original
  1. SELECT ID, Nombre, Modelo
  2. FROM (SELECT Catalogo_Producto_Id ID, tipo_producto Nombre, Modelo, Precio
  3.      FROM catalogo_productos
  4.      WHERE Estatus_Salida = 'No'
  5.     ORDER BY catalogo_producto_id DESC) t1
  6. WHERE Modelo LIKE CONCAT('%','n','%')
  7. AND ID NOT IN (SELECT tipo_producto, nombre FROM catalogo_productos
  8.         WHERE tipo_producto ='servicio'
  9.         AND ID!='000022')
  10. GROUP BY modelo
  11. ORDER BY nombre

Lo que necesito es que me muestre a todos los productos y que excluya a los que son de tipo 'Servicio' excepto a un elemento de ese grupo de servicios, hice la consulta que muestro anteriormente y me sale este error:

Error Code: 1241
Operand should contain 1 column(s)

que estoy haciendo mal??
Les agradezco de antemano

Les aclaro que el LIKE CONCAT lo tengo porque sera una consulta dinámica, mando un parámetro por medio de ajax a php y muestro en un select el resultado
  #8 (permalink)  
Antiguo 15/07/2013, 16:39
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: agrupar consulta y mostrar el id mayor del group by

Cita:
Operand should contain 1 column(s)
Tienes que aprender a interpretar el inglés técnico.
Cita:
El operando debe contener una columna
Código MySQL:
Ver original
  1. AND ID NOT IN (SELECT tipo_producto, nombre FROM catalogo_productos
  2.         WHERE tipo_producto ='servicio'
  3.         AND ID!='000022')
Estás comparando una única columna contra dos...
¿Para que pones la de nombre?

Mas allá de eso, estás haciendo una consulta demasiado complicada para estar dando vueltas alrededor de una misma tabla, en la que, además, estás aplicando condiciones de negación de negación, que en algebra booleana implica afirmación.
Si simplifico tu consulta y aplico las condiciones a la misma, esto sería su equivalente:
Código MySQL:
Ver original
  1.     `Catalogo_Producto_Id` `ID`,
  2.     `tipo_producto` `Nombre`,
  3.     `Modelo`,
  4.     `Precio`
  5.     `catalogo_productos`
  6.     `Estatus_Salida` = 'No'
  7.     AND `tipo_producto` != 'servicio'
  8.     # AND `Catalogo_Producto_Id` != '000022' <- Esta es la negacion original
  9.     AND `Modelo` LIKE CONCAT('%', 'n', '%')
  10. GROUP BY `modelo`
  11. ORDER BY `nombre``;

La tercera condición, para poner lo que correspondería a la negación negada, sería:
Código MySQL:
Ver original
  1.     `Catalogo_Producto_Id` `ID`,
  2.     `tipo_producto` `Nombre`,
  3.     `Modelo`,
  4.     `Precio`
  5.     `catalogo_productos`
  6.     `Estatus_Salida` = 'No'
  7.     AND `tipo_producto` != 'servicio'
  8.     AND `Catalogo_Producto_Id` = '000022' # la negación negada es igual a la afirmación
  9.     AND `Modelo` LIKE CONCAT('%', 'n', '%')
  10. GROUP BY `modelo`
  11. ORDER BY `nombre``;

Creo que deberías aclarar mejor las condiciones de la consulta.
Te recomiendo que tomes un papel y escribas una a una las condiciones que SI debe cumplir el resultado, y luego trata de escribir una consulta por afirmación. Compara el resultado con la que te propongo y dime qué diferencias encuentras.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 15/07/2013 a las 16:51
  #9 (permalink)  
Antiguo 15/07/2013, 18:21
Avatar de tanliz  
Fecha de Ingreso: abril-2013
Ubicación: Irapuato
Mensajes: 63
Antigüedad: 11 años, 7 meses
Puntos: 1
Mensaje Respuesta: agrupar consulta y mostrar el id mayor del group by

Gracias por tu excelente explicación, puedo darme cuenta de mis errores, y creo que la que no logra explicarse soy yo.
En el primer comentario que hiciste me sugeriste esta consulta a la que le hice un pequeño cambio para lograr mi objetivo:
Código MySQL:
Ver original
  1. SELECT ID, Nombre, Modelo, Precio
  2. FROM (SELECT   Catalogo_Producto_Id ID, Nombre, Modelo, Precio
  3.         FROM catalogo_productos
  4.         WHERE Tipo_Producto = vTipoProducto
  5.     AND Estatus_Salida = 'No'
  6.     ORDER BY catalogo_producto_id DESC) t1
  7. GROUP BY Modelo
  8. ORDER BY nombre;

Donde Tipo_Producto se divide en: Alarmas, Control de Acceso, CCTV, GPS y Servicios.
Ahora, quiero que de ese resultado me excluya a los productos que son de tipo Servicios excepto a uno donde su ID='000022'
Espero haberme explicado y puedan ayudarme.
  #10 (permalink)  
Antiguo 15/07/2013, 20:04
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: agrupar consulta y mostrar el id mayor del group by

Cita:
Ahora, quiero que de ese resultado me excluya a los productos que son de tipo Servicios excepto a uno donde su ID='000022'
Esta es la única parte relevante para la solución de lo que comentas, y tiene un pequeño problema... Implica condiciones interexcluyentes. Simplemente las condiciones se contradicen (la que excluye todo A, no permitirá recuperar un A exclusivo).
Es decir, no puedes plantear una consulta que haga eso, al menos en una simple consulta SELECT. Para poder lograr que te devuelva eso debes usar UNION, y combinar ambas busquedas.
Por otro lado, sigues complicando la consulta sin necesidad... Trata de escribir las cosas sin subconsultas, dentro de lo posible. No siempre se necesitan, y en este caso es seguro que no.
Yo intentaría:
Código MySQL:
Ver original
  1.     ID, Nombre, Modelo, Precio
  2. FROM    
  3.     (SELECT
  4.         `Catalogo_Producto_Id` `ID`,
  5.         `tipo_producto` `Nombre`,
  6.         `Modelo`,
  7.         `Precio`
  8.     FROM
  9.         `catalogo_productos`
  10.     WHERE
  11.         `Estatus_Salida` = 'No'
  12.         AND `tipo_producto` != 'servicio'
  13.     UNION
  14.     SELECT
  15.         `Catalogo_Producto_Id`,
  16.         `tipo_producto`,
  17.         `Modelo`,
  18.         `Precio`
  19.     FROM
  20.         `catalogo_productos`
  21.     WHERE
  22.         `Estatus_Salida` = 'No'
  23.         AND `tipo_producto` = 'servicio'
  24.         AND `Catalogo_Producto_Id` = '000022'
  25.     GROUP BY `modelo`) T1
  26. WHERE `Modelo` LIKE CONCAT('%', 'n', '%')
  27. ORDER BY `nombre`;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 16/07/2013, 10:11
Avatar de tanliz  
Fecha de Ingreso: abril-2013
Ubicación: Irapuato
Mensajes: 63
Antigüedad: 11 años, 7 meses
Puntos: 1
Respuesta: agrupar consulta y mostrar el id mayor del group by

Gracias! No lo había pensado de esa manera...
  #12 (permalink)  
Antiguo 16/07/2013, 10:12
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: agrupar consulta y mostrar el id mayor del group by



__________________
¿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: agrupar, group, mayor, select
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 08:34.