问题是这样的,在数据库中有一个表a记录某人和另外一人的聊天记录,a表有四个字段:id(自增),a(发送方) ,b(接收方),c(记录时间):
现在要查出所有a和b聊天的最后一条聊天记录
表中数据在下面:
查询正确显示的最终结果是下面的2,3,6这三条数据,也就是id =2,3,6
结果的意思就是aaa和bbb聊天的最后一条记录,不管是aaa还是bbb发送的。因为bbb和ccc只有一条记录,所以不需要考虑谁放给谁的,直接记录下来即可。
请大家集思广益,帮忙想想如何写查询语句!!!
附上建表和插入数据的语句:
create a (id int identity(1,1), a char(3), b char(3) , c datetime)
insert into a values('aaa','bbb','2014-05-15 10:48:24.030')
insert into a values('bbb','ccc','2014-05-15 12:48:24.000')
insert into a values('bbb','aaa','2014-05-15 14:48:24.000')
insert into a values('bbb','aaa','2014-05-15 11:20:19.827')
insert into a values('aaa','ccc','2014-05-15 11:25:56.170')
insert into a values('ccc','aaa','2014-05-15 11:38:17.310')
------解决方案--------------------
drop table a
create table a (id int identity(1,1), a char(3), b char(3) , c datetime)
insert into a values('aaa','bbb','2014-05-15 10:48:24.030')
insert into a values('bbb','ccc','2014-05-15 12:48:24.000')
insert into a values('bbb','aaa','2014-05-15 14:48:24.000')
insert into a values('bbb','aaa','2014-05-15 11:20:19.827')
insert into a values('aaa','ccc','2014-05-15 11:25:56.170')
insert into a values('ccc','aaa','2014-05-15 11:38:17.310')
select *
from a t where not exists
(select 1 from a where ((a=t.a and b=t.b) or(a=t.b and b=t.a))
and c>t.c)
2 bbb ccc 2014-05-15 12:48:24.000
3 bbb aaa 2014-05-15 14:48:24.000
6 ccc aaa 2014-05-15 11:38:17.310
------解决方案--------------------
--SQL 2012
--创建数据
create table B (id int identity(1,1), a char(3), b char(3) , c datetime)
insert into B values('aaa','bbb','2014-05-15 10:48:24.030')
insert into B values('bbb','ccc','2014-05-15 12:48:24.000')
insert into B values('bbb','aaa','2014-05-15 14:48:24.000')
insert into B values('bbb','aaa','2014-05-15 11:20:19.827')
insert into B values('aaa','ccc','2014-05-15 11:25:56.170')
insert into B values('ccc','aaa','2014-05-15 11:38:17.310')
/*
现在要查出所有a和b聊天的最后一条聊天记录
表中数据在下面:
查询正确显示的最终结果是下面的2,3,6这三条数据,也就是id =2,3,6
结果的意思就是aaa和bbb聊天的最后一条记录,不管是aaa还是bbb发送的。因为bbb和ccc只有一条记录,所以不需要考虑谁放给谁的,直接记录下来即可。
请大家集思广益,帮忙想想如何写查询语句!!!
*/
--method one
select * from b inner join (
select max(c) as c from b
group by unicode(a)+unicode(b)) as c on b.c=c.c
--method two
;with Ma as
(
select max(c) as c from b
group by unicode(a)+unicode(b)
)
select * from b inner join ma as a on a.c=b.c
--结果展示
/*
id a b c c
----------- ---- ---- ----------------------- -----------------------
2 bbb ccc 2014-05-15 12:48:24.000 2014-05-15 12:48:24.000
3 bbb aaa 2014-05-15 14:48:24.000 2014-05-15 14:48:24.000
6 ccc aaa 2014-05-15 11:38:17.310 2014-05-15 11:38:17.310
(3 行受影响)
*/