mysql建表语句:CREATE TABLE `wj_msg` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `uid` int(10) NOT NULL DEFAULT '0',
  `fuid` int(10) NOT NULL DEFAULT '0',
  `msg` varchar(255) NOT NULL DEFAULT '',
  `dt` datetime NOT NULL,
  PRIMARY KEY (`id`),
  KEY `uid` (`uid`),
  KEY `fuid` (`fuid`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;uid为发起聊天的人  fuid为收到信息的一方,都是userID. dt 为聊天时间id uid fuid msg dt
1 1 2 ****** 2013-05-14 07:10:08
2 1 3 ****** 2013-05-14 07:14:24
3 2 1 ****** 2013-05-14 07:15:00
4 2 3 ****** 2013-05-14 07:15:00
5 4 3 ****** 2013-05-14 07:15:00
6 1 6 ****** 2013-05-14 07:16:09
7 6 1 ****** 2013-05-14 07:20:55
8 7 1 ****** 2013-05-14 07:29:32需要查询 userID 为1的聊天记录.并且只取每个回话的最后一条(id较大者 或者 时间靠后的)
查询结果应该为:2 1 3 ****** 2013-05-14 07:14:24
3 2 1 ****** 2013-05-14 07:15:00
7 6 1 ****** 2013-05-14 07:20:55
8 7 1 ****** 2013-05-14 07:29:32 
在此先行谢过了!
mysql sqlMySQLSQL

解决方案 »

  1.   

    只需要userId = 1的那个人的聊天记录.所以只需要 uid = 1 或者 fuid = 1的记录.  然后是每个会话的最后一条.
    6    1    6    ******    2013-05-14 07:16:09
    7    6    1    ******    2013-05-14 07:20:55
    因为之后,  6 跟 1回复了.所以只取最后的那条 7
     
      

  2.   

    select *
    from wj_msg t
    where (uid=1 or fuid=1)
    and not Exists (select 1 from wj_msg where (uid=t.uid and fuid=t.fuid or  fuid=t.uid and uid=t.fuid ) and id>t.id)
      

  3.   

    SELECT *
     FROM ttg a
     WHERE (a.uid=1 OR a.fuid=1)
     AND NOT EXISTS
      (SELECT 1 FROM ttg WHERE ((uid=a.uid AND fuid=a.fuid) OR (fuid=a.uid AND uid=a.fuid)) AND a.dt<dt)