¿Consulta Sql para mostrar solo el mensaje más reciente para un usuario específico?

Tengo dos tablas sql, una que tiene usuarios y la otra que tiene mensajes. Ahora mismo mi consulta es:

SELECT users.memberid,users.username,users.profileimage,users.gender,message.messagebody, message.fromid,message.toid,message.messageid 
FROM message,users 
WHERE message.fromid = users.memberid AND message.toid = '$id' AND recieverdeleted='0' 
ORDER BY datetime DESC LIMIT 55

En este momento, lo que se devuelve es toda la información de cada mensaje, independientemente de la forma (identificación del remitente). La cuestión es que solo quiero mostrar el mensaje más reciente para cada identificación de remitente... Algo así como Facebook solo muestra el mensaje más reciente ese amigo x te ha enviado, y no todos los mensajes. Trabajaré para mostrar todos los mensajes después de que el usuario haya hecho clic en el mensaje más reciente de su amigo. Gracias

preguntado el 01 de julio de 12 a las 18:07

Esta misma pregunta casi exacta se hace casi todos los días. Por favor busque antes de preguntar! -

Hola, vi muchas versiones de mi pregunta, pero no pude aplicarla a mi propia consulta. ¡Gracias por el enlace! -

Resolví mi problema con la siguiente consulta (un truco): SELECCIONE usuarios.id de miembro, usuarios.nombre de usuario, usuarios.imagen de perfil, usuarios.género, mensaje.cuerpo del mensaje, mensaje.id de mensaje, mensaje.toid, mensaje.id de mensaje DESDE mensaje, usuarios WHERE mensaje.fromid = usuarios.memberid AND mensaje.toid = '$id' AND receptoreliminado='0' AND mensaje.messageid IN (SELECCIONE MAX(messageid) FROM mensaje WHERE toid ='$id' GROUP BY fromid) ORDENAR POR mensaje .datetime DESC LÍMITE 55 -

4 Respuestas

Bueno, lo intentaste. Eso es bueno.

 SELECT u.memberid
      , u.username
      , u.profileimage
      , u.gender
      , m.messagebody
      , m.fromid
      , m.toid
      , m.messageid 
   FROM users u
   JOIN message m
     ON m.fromid = u.memberid
   JOIN (SELECT fromid,toid,MAX(datetime) max_datetime FROM message GROUP BY fromid,toid) n
     ON n.fromid = m.fromid
    AND n.toid = m.toid
    AND n.max_datetime = m.datetime
  WHERE message.toid = $id 
    AND recieverdeleted = 0 
  ORDER 
     BY datetime DESC LIMIT 55;

Respondido 06 Abr '13, 12:04

Al principio join las dos tablas que se aplican order by porque en este momento el comando no está seguro para qué tabla desea aplicar el ordenamiento. O mejor, crea una tabla intermedia a partir de la selección de dos tablas y luego aplica el ordenamiento. Algo como:

SELECT username,messagebody,fromid FROM(
SELECT users.memberid,users.username,users.profileimage,users.gender,message.messagebody, message.fromid,message.toid,message.messageid,message.datetime 
FROM message,users 
WHERE message.fromid = users.memberid AND message.toid = '$id' AND recieverdeleted='0' )INTERMEDIATE_TABLE ORDER BY datetime DESC

Puede que me equivoque en la sintaxis, ya que hice códigos SQL hace mucho tiempo, pero debería intentar algo muy similar a esto.

Respondido 01 Jul 12, 18:07

Prueba esto, está funcionando

SELECT m1.* 
  FROM table_name m1 
  INNER JOIN (SELECT MAX(senddate) AS senddate, 
                     IF(member_id2 = 3, member_id1, member_id2 ) AS user 
                FROM table_name 
               WHERE (member_id1 = 3 AND delete1=0) OR 
                     (member_id2 = 3 AND delete2=0) 
              GROUP BY user) m2 
         ON m1.senddate = m2.senddate AND 
           (m1.member_id1 = m2.user OR m1.member_id2 = m2.user) 
     WHERE (member_id1 = 3 AND delete1=0) OR 
           (member_id2 = 3 AND delete2=0) 
   ORDER BY m1.senddate DESC

Respondido 06 Abr '13, 12:04

¿Es esto en respuesta a una pregunta diferente? - Frutillas

Prueba esto::

   SELECT users.memberid,users.username,users.profileimage,users.gender,message.messagebody, message.fromid,message.toid,message.messageid 

FROM message inner join users on (message.fromid = users.memberid)
where  message.toid = '$id' AND recieverdeleted='0' 
ORDER BY message_datetime DESC limit 1

Respondido 01 Jul 12, 18:07

Gracias, pero esta consulta sigue devolviendo todos los mensajes para los respectivos usuarios. - Lisa Monserrate

¿¿Qué es exactamente lo que necesita?? La consulta le devolverá el mensaje más reciente del usuario en la cláusula where, ¿necesita la lista de todos los usuarios, junto con su último mensaje? - sashi kant

Básicamente, si hay algunos mensajes con el mismo fromid y toid, la consulta anterior devolverá TODOS esos mensajes (al igual que mi consulta). Solo quiero el mensaje más reciente para el toid desde el fromid si hay varios mensajes del mismo hacia y desde los id. - Lisa Monserrate

Gracias, entiendo el LÍMITE 1, el único problema con eso es que el límite 1 no permitirá que se muestren mensajes de otros fromids... ¡Problema complicado! - Lisa Monserrate

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.