【问题标题】:Sql query to show only most recent message for specific user?Sql 查询仅显示特定用户的最新消息?
【发布时间】:2012-07-01 17:05:24
【问题描述】:

我有两个 sql 表,一个有用户,另一个有消息。 现在我的查询是:

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

现在返回的是每条消息的所有信息,无论是什么形式(发件人的 id) 问题是,我只想显示每个来自 id 的最新消息 ..有点像 Facebook 如何只显示朋友 x 发送给你的最新消息,而不是所有消息。在用户点击他朋友的最新消息后,我将努力显示所有消息。 谢谢

【问题讨论】:

  • 几乎每天都会有人问这个几乎完全相同的问题。提问前请先搜索!
  • 您好,我看到有人问了我的问题的许多版本,但无法将其应用于我自己的查询。不过感谢您的链接!
  • 用以下查询解决了我的问题(有点小技巧):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' AND message.messageid IN (SELECT MAX(messageid) FROM message WHERE toid ='$id ' GROUP BY fromid) ORDER BY message.datetime DESC LIMIT 55

标签: mysql sql database


【解决方案1】:

嗯,你试过了。这很好。

 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;

【讨论】:

    【解决方案2】:

    首先join 这两个表比应用order by 因为此时命令不确定您要对哪个表应用排序。 或者更好的是,您从两个表的选择中创建一个中间表,然后应用排序。 比如:

    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
    

    我可能在语法上错了,因为我很久以前做过 sql 代码,但你应该尝试类似这样的东西。

    【讨论】:

      【解决方案3】:

      试试它的工作原理

      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
      

      【讨论】:

      • 这是在回答不同的问题吗?
      【解决方案4】:

      试试这个::

         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
      

      【讨论】:

      • 谢谢,但此查询仍会返回相应用户的所有消息。
      • 您到底需要什么?该查询将在 where 子句中返回用户的最新消息,您是否需要所有用户的列表以及他们的最新消息?
      • 基本上,如果有几条消息都具有相同的 fromid 和 toid ,则上面的查询将返回所有这些消息(就像我的查询一样)。如果有多个消息来自同一个 id 和来自 id 的多条消息,我只想要从 fromid 到 toid 的最新消息。
      • 谢谢,我了解限制 1,唯一的问题是限制 1 将不允许显示其他 fromid 的消息..棘手的问题!!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-27
      相关资源
      最近更新 更多