当前位置: 代码迷 >> Sql Server >> 关于对话的一张表,怎么选出某人和所有人的最后一次对话
  详细解决方案

关于对话的一张表,怎么选出某人和所有人的最后一次对话

热度:46   发布时间:2016-04-24 09:59:24.0
关于对话的一张表,如何选出某人和所有人的最后一次对话?
是这样,我有张表,字段是这样的
id, from, to, message
其中id是对话的id,默认int自增加1
from和to是用户的id,也是数字。
message是对话内容。

比如用户1和2之间的对话,from和to可以互换,因为可能是1给2发送信息,也可能是2给1发送信息。

比如表里面的内容是这样:
1  1  2  你好
2  2  1  你好啊
3  1  2  想认识你
4  2  1  你谁啊。。
5  1  3  你好
6  4  1  你好

这里有4个用户,我想选出用户1的所有对话,包含最后一次对话的内容,还有和每个用户分别对话的总数
结果应该是
2  你谁啊 4 (总共有4次对话,最后一次是“你谁啊”)
3  你好  1(总共只有1次对话,1发给3的)
4  你好  1 (总共只有1次对话,4发给1的)

请问这样的表,应该怎么写sql语句啊。。。 对于这样的group by,实在有点搞不懂。。。
------解决思路----------------------

WITH a0 (id,nFROM,nTO,mes) AS
(
SELECT 1,  1,  2,'你好' UNION ALL
SELECT 2,  2,  1,'你好啊' UNION ALL
SELECT 3,  1,  2,'想认识你' UNION ALL
SELECT 4,  2,  1,'你谁啊。。' UNION ALL
SELECT 5,  1,  3,'你好' UNION ALL
SELECT 6,  4,  1,'你好'
)
,a1 AS
(
SELECT 
CASE WHEN nFROM=1 THEN nTO ELSE nFROM END nTO,
(SELECT MAX(id) FROM a0 b WHERE (b.nFROM=a.nFROM AND b.nTO=a.nTO) OR (b.nFROM=a.nTO AND b.nTO=a.nFROM)) id
FROM a0 a
WHERE nFROM=1 OR nTO=1
)
,a2 AS
(
SELECT nTO,MAX(id) id,COUNT(*) cnt
FROM a1
GROUP BY nTO
)
SELECT nTO,(SELECT mes FROM a0 WHERE id=a.id) mes,cnt
FROM a2 a
ORDER BY 1

------解决思路----------------------

DECLARE @from INT
SET @from=1
;WITH a0 (id,[from],[to],[message]) AS
(
SELECT 1,  1,  2,'你好' UNION ALL
SELECT 2,  2,  1,'你好啊' UNION ALL
SELECT 3,  1,  2,'想认识你' UNION ALL
SELECT 4,  2,  1,'你谁啊。。' UNION ALL
SELECT 5,  1,  3,'你好' UNION ALL
SELECT 6,  4,  1,'你好'
)
,a1 AS
(
SELECT 
CASE WHEN [from]=@from THEN [to] ELSE [from] END [to],
(SELECT MAX(id) FROM a0 b WHERE (b.[from]=a.[from] AND b.[to]=a.[to]) OR (b.[from]=a.[to] AND b.[to]=a.[from])) id
FROM a0 a
WHERE [from]=@from OR [to]=@from
)
,a2 AS
(
SELECT [to],MAX(id) id,COUNT(*) cnt
FROM a1
GROUP BY [to]
)
SELECT [to],(SELECT [message] FROM a0 WHERE id=a.id) [message],cnt
FROM a2 a
ORDER BY 1

------解决思路----------------------

with temp1 as 
(select 1 as id,1 as uid1,2 as uid2 ,'你好'message union all
select 2 as id,2 as uid1,1 as uid2 ,'你好啊'message union all
select 3 as id,1 as uid1,2 as uid2 ,'想认识你'message union all
select 4 as id,2 as uid1,1 as uid2 ,'你谁啊'message union all
select 5 as id,1 as uid1,3 as uid2 ,'你好'message union all
select 6 as id,4 as uid1,1 as uid2 ,'你好'message ),
temp2 as 
(
select id
,case when uid1 = 1 then 1 when uid2 = 1 then 1 end uid1--将所有1参与的对话中 1的人员ID都处理到uid1
,case when uid1 = 1 then uid2 when uid2 = 1 then uid1 end uid2--将其他人的人员ID都处理到uid2,这样就很方便了
,message 
from temp1 
where (uid1=1 or uid2=1)
),
resulttable as 
(
 select MAX(id) id,uid1,uid2,COUNT(id) rowscount from temp2  group by uid1,uid2
)
select a.uid2,b.message,a.rowscount from resulttable a
left join temp1 b on a.id = b.id
 
uid2        message  rowscount
----------- -------- -----------
2           你谁啊      4
3           你好       1
4           你好       1

(3 行受影响)
  相关解决方案