Ver Mensaje Individual
  #15 (permalink)  
Antiguo 06/01/2012, 10:51
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: agrupar por campos y ordenar

Hola compañeros:

La solución no es tan trivial como propone el compañero gnzsoloyo... si entendí correctamente con sólo ORDER BY no se puede obtener el resultado que quiere diegohugogallego:

Si ordenas por comentarista y fecha obtienes

Código MySQL:
Ver original
  1. mysql> SELECT usuario, comentarista, fecha
  2.     -> FROM tabla
  3.     -> WHERE usuario = 'fran'
  4.     -> ORDER BY comentarista ASC, fecha DESC;
  5. +---------+--------------+-------+
  6. | usuario | comentarista | fecha |
  7. +---------+--------------+-------+
  8. | fran    | angel        |  2011 |
  9. | fran    | angel        |  1999 |
  10. | fran    | helen        |  2000 |
  11. | fran    | laura        |  2012 |
  12. | fran    | laura        |  2010 |
  13. +---------+--------------+-------+
  14. 5 rows in set (0.00 sec)

El problema es que el primer registro NO CORRESPONDE A LA FECHA MÁXIMA.

Si ordenas primero por fecha y comentarista obtienes:

Código MySQL:
Ver original
  1. mysql> SELECT usuario, comentarista, fecha
  2.     -> FROM tabla
  3.     -> WHERE usuario = 'fran'
  4.     -> ORDER BY fecha DESC, comentarista;
  5. +---------+--------------+-------+
  6. | usuario | comentarista | fecha |
  7. +---------+--------------+-------+
  8. | fran    | laura        |  2012 |
  9. | fran    | angel        |  2011 |
  10. | fran    | laura        |  2010 |
  11. | fran    | helen        |  2000 |
  12. | fran    | angel        |  1999 |
  13. +---------+--------------+-------+
  14. 5 rows in set (0.02 sec)

El problema es que los registros NO QUEDAN AGRUPADOS POR COMENTARISTA.

La solución que encontré no es del todo sencilla, pero creo que puede funcionar.

Código MySQL:
Ver original
  1. mysql> SET @num = 0;
  2. Query OK, 0 rows affected (0.00 sec)
  3.  
  4. mysql> SELECT T2.usuario, t2.comentarista, t2.fecha FROM
  5.     -> (
  6.     -> SELECT MAX(fecha) fecha, usuario, comentarista,
  7.     -> @num := @num + 1 AS row_number
  8.     -> FROM tabla
  9.     -> WHERE usuario = 'fran'
  10.     -> GROUP BY usuario, comentarista
  11.     -> ORDER BY fecha DESC) T1 INNER JOIN
  12.     -> (
  13.     -> SELECT usuario, o.comentarista, o.fecha,
  14.     -> FIND_IN_SET( o.fecha ,
  15.     -> ( SELECT GROUP_CONCAT(fecha ORDER BY fecha DESC)
  16.     -> FROM tabla i
  17.     -> WHERE i.comentarista = o.comentarista AND i.usuario = o.usuario)
  18.     -> ) AS row_number_2 FROM tabla o
  19.     -> WHERE usuario = 'fran'
  20.     -> ORDER BY comentarista, row_number_2) T2
  21.     -> ON T1.usuario = T2.usuario AND T1.comentarista = T2.comentarista
  22.     -> ORDER BY T1.row_number, T2.row_number_2;
  23. +---------+--------------+-------+
  24. | usuario | comentarista | fecha |
  25. +---------+--------------+-------+
  26. | fran    | laura        |  2012 |
  27. | fran    | laura        |  2010 |
  28. | fran    | angel        |  2011 |
  29. | fran    | angel        |  1999 |
  30. | fran    | helen        |  2000 |
  31. +---------+--------------+-------+
  32. 5 rows in set (0.06 sec)

La consulta se conforma de dos subconsultas, la primera para determinar el orden en que deben presentarse los comentarista DE ACUERDO AL MÁXIMO AÑO QUE TENGAN ASIGNADO, es decir, algo como esto:

Código MySQL:
Ver original
  1. mysql> SET @num = 0;
  2. Query OK, 0 rows affected (0.00 sec)
  3.  
  4. mysql> SELECT MAX(fecha) fecha, usuario, comentarista,
  5.     -> @num := @num + 1 AS row_number
  6.     -> FROM tabla
  7.     -> WHERE usuario = 'fran'
  8.     -> GROUP BY usuario, comentarista
  9.     -> ORDER BY fecha DESC;
  10. +-------+---------+--------------+------------+
  11. | fecha | usuario | comentarista | row_number |
  12. +-------+---------+--------------+------------+
  13. |  2012 | fran    | laura        |          1 |
  14. |  2011 | fran    | angel        |          2 |
  15. |  2000 | fran    | helen        |          3 |
  16. +-------+---------+--------------+------------+
  17. 3 rows in set (0.00 sec)

La segunda parte es para determinar el orden en que deben presentarse los registros para cada comentarista DE ACUERDO A LA FECHA, es decir:

Código MySQL:
Ver original
  1. mysql> SELECT usuario, o.comentarista, o.fecha,
  2.     -> FIND_IN_SET( o.fecha ,
  3.     -> ( SELECT GROUP_CONCAT(fecha ORDER BY fecha DESC)
  4.     -> FROM tabla i
  5.     -> WHERE i.comentarista = o.comentarista AND i.usuario = o.usuario)
  6.     -> ) AS row_number_2 FROM tabla o
  7.     -> WHERE usuario = 'fran'
  8.     -> ORDER BY comentarista, row_number_2;
  9. +---------+--------------+-------+--------------+
  10. | usuario | comentarista | fecha | row_number_2 |
  11. +---------+--------------+-------+--------------+
  12. | fran    | angel        |  2011 |            1 |
  13. | fran    | angel        |  1999 |            2 |
  14. | fran    | helen        |  2000 |            1 |
  15. | fran    | laura        |  2012 |            1 |
  16. | fran    | laura        |  2010 |            2 |
  17. +---------+--------------+-------+--------------+
  18. 5 rows in set (0.02 sec)

Finalmente haces la unión de ambas partes y ordenas por los campos row_number que obtuviste en casa subconsulta.

Igual y no es la forma más óptima de hacer la consulta, si encuentro alguna otra forma más fácil de hacerlo la posteo.

Saludos y espero que te sirva el código.
Leo