miércoles, 22 de agosto de 2012

GROUP BY de los últimos registros en MySQL

Esta semana me encontré con un problema. Tenia una tabla similar a la siguiente:

id nro_colectivo fecha chofer
1 800 2012-08-19 Pablo
2 801 2012-08-19 Juan
3 802 2012-08-20 Mariano
4 802 2012-08-21 Pablo
5 800 2012-08-21 Daniel

Y necesitaba obtener el ultimo registro de cada colectivo. Osea:

id nro_colectivo fecha chofer
2 801 2012-08-19 Juan
4 802 2012-08-21 Pablo
5 800 2012-08-21 Daniel

Si hacemos la siguiente consulta:
  SELECT * FROM tabla GROUP BY nro_colectivo
este sería el resultado:

id nro_colectivo fecha chofer
1 800 2012-08-19 Pablo
2 801 2012-08-19 Juan
3 802 2012-08-20 Mariano

Como se puede ver lo que devolvió fue el primer registro de cada uno. Si agregáramos un ORDER BY id DESC obtendríamos las mismas filas solo que ordenadas de mayor a menor, Osea 3, 2, 1.

Para obtener el resultado deseado hay que hacer la consulta de la siguiente manera:
  SELECT * FROM ( SELECT * FROM tabla ORDER BY id DESC )sub GROUP BY nro_colectivo

Lo que estoy haciendo es una consulta anidada. Osea hago una consulta que me traiga toda la tabla, pero ordenada en forma descendente, le doy un nombre, 'sub' en este caso, y a esta le hago una segunda consulta pidiendo que me agrupe los datos por el numero de colectivo.

Espero que les sirva.

Sobre el autor