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

[SOLUCIONADO] Consulta con GROUP y ORDER

Estas en el tema de Consulta con GROUP y ORDER en el foro de Mysql en Foros del Web. Hola. Tengo una tabla con los siguientes campos: id_de_orden (es numerico autoincrementable) estado (es enum y puede ser S o N) fecha_de_inicio (es de tipo ...
  #1 (permalink)  
Antiguo 22/01/2014, 03:15
 
Fecha de Ingreso: mayo-2012
Ubicación: Madrid
Mensajes: 7
Antigüedad: 12 años, 5 meses
Puntos: 0
Pregunta Consulta con GROUP y ORDER

Hola. Tengo una tabla con los siguientes campos:
id_de_orden (es numerico autoincrementable)
estado (es enum y puede ser S o N)
fecha_de_inicio (es de tipo fecha)
id_de_categoria (es numerico, no unico ni autoincrementable)

Necesito recuperar el id_de_orden y el estado agrupado por id_de_categoria, de forma que me devuelva el id_de_orden y el estado del registro con la fecha_de_inicio más reciente en cada grupo de id_de_categoria (La fecha más reciente de un grupo no tiene por que coincidir con la fecha más reciente de otro).

He probado con
SELECT id_orden, estado FROM tabla GROUP BY id_de_categoria;
y tb con
SELECT id_orden, estado FROM tabla GROUP BY id_de_categoria ORDER BY fecha_de_inicio DESC;
y con
SELECT id_orden, estado FROM tabla GROUP BY id_de_categoria ORDER BY fecha_de_inicio ASC;

pero siempre me devuelve el registro más antiguo de cada grupo, no el más reciente, que es el que necesito.

¿Cómo podría resolverlo?
Gracias a todos
  #2 (permalink)  
Antiguo 22/01/2014, 03:28
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 8 meses
Puntos: 574
Respuesta: Consulta con GROUP y ORDER

Código MySQL:
Ver original
  1. SELECT t.id_de_categoria,t.id_orden, t.fecha_de_inicio, t.estado FROM tabla t
  2.     INNER JOIN
  3.          (SELECT MAX(fecha_de_inicio) MFecha  FROM tabla GROUP BY id_de_categoria) Sbc
  4.     ON tabla.fecha_de_inicio=Sbc.MFecha
  5. ORDER BY t.id_de_categoria;

Para que esto funcione perfecto fecha_de_inicio debería ser DATETIME para poder distinguir entre registros del mismo dia.

Por otro lado si la fecha es automática podrías usar id_de_orden, es decir si automaticamente se guarda la fecha actual, luego máx id de orden coincidirá con la fecha más reciente... con lo que no necesitarás el DATETIME, si la fecha se pone a mano el último id de orden podría llevar una fecha del siglo pasado....

Código MySQL:
Ver original
  1. SELECT t.id_de_categoria,t.id_orden, t.fecha_de_inicio, t.estado FROM tabla t
  2.     INNER JOIN
  3.          (SELECT MAX(id_de_orden) MOrden  FROM tabla GROUP BY id_de_categoria) Sbc
  4.     ON tabla.id_de_orden=Sbc.MOrden
  5. ORDER BY t.id_de_categoria;
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 22/01/2014 a las 03:35
  #3 (permalink)  
Antiguo 22/01/2014, 04:21
 
Fecha de Ingreso: mayo-2012
Ubicación: Madrid
Mensajes: 7
Antigüedad: 12 años, 5 meses
Puntos: 0
Respuesta: Consulta con GROUP y ORDER

Hola.
Te agradezco el planteamiento que me has mandado. No obstante hay un problema. La tabla tiene, aprox 21000 registros (en diferentes categorías) y la consulta genera (inexplicablemente) más de 641000 filas. De hecho, al intentar alojarlas en una matriz, me da un error de memoria.

Por cierto. El campo fecha_de_inicio es de tipo DATE.

Debe haber algo en esta consulta que multiplica el número de filas recuperadas. La verdad es que no tengo experiencia con los JOIN.

  #4 (permalink)  
Antiguo 22/01/2014, 04:54
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 7 meses
Puntos: 300
Respuesta: Consulta con GROUP y ORDER

Prueba así y creo que te sacará la fecha más reciente de cada id_de_categoria:
Código MySQL:
Ver original
  1.     t1.id_de_orden,
  2.     t1.id_de_categoria,
  3.     t1.fecha_de_inicio FROM
  4.    (SELECT
  5.          id_de_orden,
  6.          id_de_categoria,
  7.          fecha_de_inicio
  8.      FROM tutabla
  9.          ORDER BY
  10.                    id_de_categoria,
  11.                    fecha_de_inicio DESC) t1
  12.      t1.id_de_categoria,

Última edición por jurena; 22/01/2014 a las 05:50
  #5 (permalink)  
Antiguo 22/01/2014, 06:09
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 8 meses
Puntos: 574
Respuesta: Consulta con GROUP y ORDER

Craso error!!!!! Falta relacionar el maximo con su categoria.....

Código MySQL:
Ver original
  1. SELECT t.id_de_categoria,t.id_orden, t.fecha_de_inicio, t.estado FROM tabla t
  2.     INNER JOIN
  3.          (SELECT id_de_categoria,MAX(fecha_de_inicio) MFecha  FROM tabla GROUP BY id_de_categoria) Sbc
  4.     ON tabla.fecha_de_inicio=Sbc.MFecha AND tabla.id_de_categoria=Sbc.id_de_categoria
  5. ORDER BY t.id_de_categoria;

Código MySQL:
Ver original
  1. SELECT id_de_categoria,MAX(fecha_de_inicio) MFecha  FROM tabla GROUP BY id_de_categoria

Esto nos da la última fecha de cada categoria al relacionarla se puede obtener el resto de datos del registro, pero al ser de tipo date no es seguro que sea único.... Puede haber mas de un registro con la última fecha y la misma categoria....

Si se usa el id de orden no seria necesario puesto que son valores únicos....

Código MySQL:
Ver original
  1. SELECT t.id_de_categoria,t.id_orden, t.fecha_de_inicio, t.estado FROM tabla t
  2.     INNER JOIN
  3.          (SELECT id_de_categoria,MAX(id_de_orden) MOrden  FROM tabla GROUP BY id_de_categoria) Sbc
  4.     ON tabla.id_de_orden=Sbc.MOrden AND tabla.id_de_categoria=Sbc.id_de_categoria
  5. ORDER BY t.id_de_categoria;

Código MySQL:
Ver original
  1. SELECT id_de_categoria,MAX(id_de_orden) MOrden  FROM tabla GROUP BY id_de_categoria

Esto nos da el último id orden de cada categoria, al usarlo en el join obtengo el resto de datos del registro.

===============
Tema fecha

Cita:
Por cierto. El campo fecha_de_inicio es de tipo DATE.
Pero es automática, es decir puedo poner la fecha de ayer, o automáticamente coje la de hoy? Si no es asi tienes que usar la primera opción MAX(fecha_de_inicio), la versión corregida, pero tendrás el problema de que puede haber dos registros en la misma fecha....

Si la fecha es automática puedes usar MAX(id_de_orden) tanto la versión del primer post como la del segundo funcionarán....
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 22/01/2014 a las 06:29
  #6 (permalink)  
Antiguo 23/01/2014, 02:35
 
Fecha de Ingreso: mayo-2012
Ubicación: Madrid
Mensajes: 7
Antigüedad: 12 años, 5 meses
Puntos: 0
De acuerdo Respuesta: Consulta con GROUP y ORDER

Gracias a los dos por vuestra aportación. Me habéis hecho un gran favor. Un saludo.

Etiquetas: group-by, order-by
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 00:17.