0

我有一个表结构,其中记录了发送和接收的消息,如下所示;

数据库表结构

member_id1 是发送者,member_id2 是接收者。

现在我想要实现的是获取具有 member_id 为 3 的用户的最新消息的行。结果应该只包含消息 id 为 2 和 4 的 2 行,因为 2 是最后一条消息在 member_id 为 3 的用户和 member_id 为 2 的用户之间,4 是 member_id 为 3 的用户和 member_id 为 1 的用户之间的唯一消息。

结果不应包含 message_id 为 3 的行,因为它与 member_id 为 3 的用户和 message_id 为 1 的用户无关,因为它已被 message_id 为 2 的消息过时。

希望我已经为那些可以帮助我解决这个问题的人明确了我的问题。

4

3 回答 3

1

我想我已经为自己的问题找到了正确的答案。虽然我不太确定,但它似乎工作得很好。对于那些需要解决此类问题的人;试试这个:

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
于 2012-08-13T02:40:03.147 回答
0

这个问题有点模糊,但据我所知,你在寻找这个?

 SELECT * FROM table_name WHERE member_id2 = 3 ORDER BY senddate DESC;
于 2012-08-12T13:10:12.250 回答
0

你可以使用 UNION 来组合它们

 (SELECT * FROM table_name WHERE member_id2 = 3  ORDER BY senddate DESC limit 1)
union 
 (SELECT * FROM table_name WHERE member_id1 = 3  ORDER BY senddate DESC limit 1)

或者,如果您需要获取每个成员的最新发送/接收信息,您可以内部加入一个查询,获取每个成员的最大发送日期:

select * from table_name t1 inner join 
(
 select member_id1, null as member_id2, max(senddate) as senddate 
 from table_name group by member_id1
 UNION
 select null as member_id1, member_id2, max(senddate) as senddate 
 from table_name group by member_id2
) r ON (t1.member_id1 = r.member_id1 OR t1.member_id2 = r.member_id2) 
AND t1.senddate = r.senddate 
于 2012-08-12T14:12:14.840 回答