Ver Mensaje Individual
  #3 (permalink)  
Antiguo 05/06/2013, 08:20
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: Consulta con distinct y order by

Hola ivan89:

hay varios detalles en tus consultas, que supongo que son por desconocimiento de cómo funciona el operador DISTINCT...

La función DISTINCT omite los registros repetidos, el detalle está en que un registro repetido es aquel DONDE TODOS SUS CAMPOS SON EXACTAMENTE IGUALES... cuando haces un

Código:
... DISTINCT usuario FROM ...
la consulta funciona porque SÓLO ESTÁ CONSIDERANDO LA COLUMNA USUARIO...

cuando haces un

Código:
... DISTINCT usuario, comentario, fecha ...
Estás comparando LOS TRES CAMPOS... conque uno solo de ellos SEA DISTINTO, entonces se mostrará en la consulta.

Ahora bien, la idea del GROUP BY no está tan errada, sin embargo DEBES HACER USO DE FUNCIONES DE AGRUPACIÓN (MIN, MAX, COUNT, etc.)... es cuestión de que practiques un poco más.

Ahora si, volviendo al problema original... en realidad este tipo de consultas es de las más comunes en SQL, hay muchos ejemplos en este foro o en la red para resolverlo, y en realidad existen muchas formas para hacerlo... con IN, con EXISTS, con HAVING (como propone Gedeon). Sin embargo una de las maneras más sencillas y desde mi punto de vista la que mejor rendimiento tiene es hacerlo con una subconsulta. veamos el ejemplo, con los datos que tienes en tu tabla:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla;
  2. +------------+---------+---------------------+
  3. | comentario | Usuario | Fecha               |
  4. +------------+---------+---------------------+
  5. | comentario | david   | 2013-06-05 23:30:00 |
  6. | comentario | jose    | 2013-06-05 23:20:00 |
  7. | comentario | david   | 2013-06-04 13:30:00 |
  8. | comentario | david   | 2013-06-04 13:15:00 |
  9. | comentario | carlos  | 2013-06-04 13:10:00 |
  10. | comentario | david   | 2013-06-04 12:30:00 |
  11. | comentario | ruben   | 2013-06-04 12:00:00 |
  12. +------------+---------+---------------------+
  13. 7 rows in set (0.00 sec)


Como te interesa el ÚLTIMO comentario de cada usuario, utilizas la función MAX y la cláusula GROUP BY, así:

Código MySQL:
Ver original
  1. mysql> SELECT usuario, MAX(fecha) FROM tabla GROUP BY usuario;
  2. +---------+---------------------+
  3. | usuario | MAX(fecha)          |
  4. +---------+---------------------+
  5. | carlos  | 2013-06-04 13:10:00 |
  6. | david   | 2013-06-05 23:30:00 |
  7. | jose    | 2013-06-05 23:20:00 |
  8. | ruben   | 2013-06-04 12:00:00 |
  9. +---------+---------------------+
  10. 4 rows in set (0.00 sec)

Ahora bien, si también necesitas extaer el comentario que corresponde o algún otro dato, de tu tabla, puedes hacer un INNER JOIN para filtrar la información a partir de esta consulta, así:

Código MySQL:
Ver original
  1. mysql> SELECT T1.*
  2.     -> FROM tabla T1
  3.     -> INNER JOIN
  4.     -> (  SELECT usuario, MAX(fecha) max_fecha
  5.     ->    FROM tabla
  6.     ->    GROUP BY usuario) T2
  7.     -> ON T1.usuario = T2.usuario AND T1.fecha = T2.max_fecha;
  8. +------------+---------+---------------------+
  9. | comentario | Usuario | Fecha               |
  10. +------------+---------+---------------------+
  11. | comentario | david   | 2013-06-05 23:30:00 |
  12. | comentario | jose    | 2013-06-05 23:20:00 |
  13. | comentario | carlos  | 2013-06-04 13:10:00 |
  14. | comentario | ruben   | 2013-06-04 12:00:00 |
  15. +------------+---------+---------------------+
  16. 4 rows in set (0.00 sec)

Dale un vistazo y cualquier duda la comentas en el foro y con gusto tratamos de ayudarte.

Saludos
Leo.