形如短信的会话列表
数据库如下
表名:Messages
字段:
ID(自动编号)
ToEmpID(接收人ID)
FromEmpID(发送人ID)
SendDate(发送日期)
Detail(内容)
求检索出接收人和发送人都不会重复的会话列表,日期为最大日期,且按日期倒序排序,就像智能手机上的短信会话模式一样。
例如我叫张三
最后结果:
发送人 接收人 最新日期
张三 李四 6月6日
王五 张三 6月3日
刘六 张三 6月2日
(第一行发送人是“张三”,是因为最近是我发出给李四的信息,所以结果后面不能再显示李四发给我的记录)
------解决方案--------------------
WITH Messages (ID,ToEmpID,FromEmpID,SendDate,Detail) AS
(
SELECT 1,'张三','李四','2014/06/05','a' UNION ALL
SELECT 2,'王五','张三','2014/06/03','b' UNION ALL
SELECT 3,'刘六','张三','2014/06/02','b' UNION ALL
SELECT 4,'张三','李四','2014/05/05','a' UNION ALL
SELECT 5,'王五','张三','2014/05/03','b' UNION ALL
SELECT 6,'刘六','张三','2014/05/02','b'
)
SELECT ID,ToEmpID,FromEmpID,SendDate FROM Messages a
WHERE ID in
(
SELECT TOP 1 ID
FROM Messages
where ToEmpID=a.ToEmpID AND FromEmpID=a.FromEmpID
ORDER BY SendDate DESC
)
------解决方案--------------------
DECLARE @Message TABLE(ID INT,ToEmpID NVARCHAR(200),FromEmpID NVARCHAR(200),SendDate DATETIME,Detail NVARCHAR(500))
INSERT INTO @Message(ID,ToEmpID,FromEmpID,SendDate,Detail)
SELECT 1,'张三','李四','2014/06/05','ha ha' UNION ALL
SELECT 2,'李四','张三','2014/06/06','he he' UNION ALL
SELECT 3,'张三','李四','2014/06/07','bye bye' UNION ALL
SELECT 4,'张三','王五','2014/05/05','SB' UNION ALL
SELECT 5,'王五','张三','2014/05/07','NB' UNION ALL
SELECT 6,'刘六','张三','2014/05/02','ML' UNION ALL
SELECT 7,'张三','刘六','2014/06/07','DL'
SELECT FromEmpID AS 发件人
,ToEmpID AS 收件人
,SendDate AS 最新日期
FROM @Message a
WHERE NOT EXISTS(SELECT * FROM @Message
WHERE ((a.ToEmpID = ToEmpID AND a.FromEmpID = FromEmpID)
OR (a.ToEmpID = FromEmpID AND a.FromEmpID = ToEmpID))
AND SendDate > a.SendDate)
发件人 收件人 最新日期
----------------------------- --------------------------------------------------------
李四 张三 2014-06-07 00:00:00.000
张三 王五 2014-05-07 00:00:00.000
刘六 张三 2014-06-07 00:00:00.000
(3 行受影响)