2011-12-19 24 views
8

que tiene declaración MySQLMySQL seleccione Agrupar por fin

SELECT * 
FROM tbl_messages 
WHERE to_user_id = '$user_id' OR from_user_id = '$user_id' 
GROUP BY from_user_id 
ORDER BY date_sent DESC 

y está produciendo los resultados correctos sin embargo, no están en el orden correcto.

La agrupación funciona bien, pero el registro que se muestra en el grupo es la primera grabación registrada en la base de datos, pero me gustaría que se muestre el último registro en cada grupo.

¿Hay alguna forma de tener el último registro visualizado para cada grupo?

2011-12-19 12:16:25 This is the first message 
2011-12-19 12:18:20 This is the second message 
2011-12-19 12:43:04 This is the third message 

El grupo muestra 'Este es el primer mensaje' donde me gustaría 'Este es el tercer mensaje' ya que es la más reciente grabación/mensaje.

Saludos

+0

¿Qué se supone que debe mostrar la consulta? –

+0

Si solo necesita las dos columnas (por ejemplo, ID y su última marca de tiempo), esto podría funcionar: http://stackoverflow.com/a/4448536/722036. Es ** más rápido ** que usar subconsultas en una tabla enorme con millones de filas. –

Respuesta

9

Esto puede funcionar (pero no garantizado):

SELECT * 
FROM 
    (SELECT * 
    FROM tbl_messages 
    WHERE to_user_id = '$user_id' OR from_user_id = '$user_id' 
    ORDER BY date_sent DESC 
) tmp 
GROUP BY from_user_id 
ORDER BY date_sent DESC 

esto debería funcionar:

SELECT t.* 
FROM 
    tbl_messages AS t 
    JOIN 
    (SELECT from_user_id 
      , MAX(date_sent) AS max_date_sent 
     FROM tbl_messages 
     WHERE to_user_id = '$user_id' OR from_user_id = '$user_id' 
     GROUP BY from_user_id 
    ) AS tg 
    ON (tg.from_user_id, tg.max_date_sent) = (t.from_user_id, t.date_sent) 
ORDER BY t.date_sent DESC 
+0

Esto parece estar funcionando. Se necesita una pequeña modificación (agregue tbl_messages antes del GROUP BY) pero se ve bien. ¡Gracias! – puks1978

+0

Gracias, ahorre mi día, en la escuela aprendí más sobre subquerys ... No recuerdo estas grandes preguntas ... mi maestra ... viejos recuerdos – delive

-1

Qué quiere decir algo como esto:

 
SELECT * FROM tbl_messages WHERE to_user_id = '$user_id' OR from_user_id = '$user_id' GROUP BY from_user_id ORDER BY from_user_id, date_sent DESC 

2

Si los mensajes tabla tiene una clave principal que es auto-incremento, y todos los mensajes son por naturaleza mayor número es la fecha más reciente ... Sin embargo, dado que NO LO SÉ, voy basado en el MAX (date_sent) en lugar de max (SomeIDKey), pero el principio es el mismo.

select 
     tm2.* 
    from 
     (select tm1.from_user_id, 
       max(tm1.date_sent) LatestMsgDate 
      from tbl_messages tm1 
      group by tm1.from_user_id) MaxPerUser 

     left join tbl_messages tm2 
     on MaxPerUser.From_User_ID = tm2.From_User_ID 
     AND MaxPerUser.LatestMsgDat = tm2.Date_Sent 

    order by 
     date_sent DESC 
+0

cómo agregar ORDER BY en MaxPerUser y GROUP BY al final de la consulta. –

+1

@MohammedAbrarAhmed, no hay orden aplicable a la consulta interna MaxPerUser. Sin embargo, si desea obtener los resultados externos en función de la fecha del mensaje más reciente, puede ORDENAR POR MaxPerUser.LatestMsgDate, si eso es lo que está considerando tener los mensajes más recientes flotando en la parte superior. – DRapp

8

Hacer un GROUP BY después de que el ORDER BY envolviendo la consulta con el GROUP BY como este:

SELECT t.* FROM (SELECT * FROM table ORDER BY time DESC) t GROUP BY t.from 
+0

Incluso si puse el ASC en la consulta "t" está tomando DESC. –