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

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

热度:75   发布时间:2016-04-24 09:59:36.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,实在有点搞不懂。。。
------解决思路----------------------
“我想选出用户1的所有对话
包含最后一次对话的内容,还有和每个用户分别对话的总数
结果应该是

你想选出用户1所有对话,指的是由1发出的记录还是别给发给1的记录?
最后一次对话的内容是发出的还是收到的

1分别对话的总数是 和2是4次?和3是1次?和4是1次吗?
------解决思路----------------------
请问希望结果中,
2  你谁啊 4 (总共有4次对话,最后一次是“你谁啊”)  --> 统计的是用户1的最后消息记录,这其中的2,4是怎么来的?
3  你好  1(总共只有1次对话,1发给3的)  --> 1发给3的  顺序是 3 [内容] 1
4  你好  1 (总共只有1次对话,4发给1的) --> 4发给1的  但顺序是 4 [内容] 1  请问结果中确定前后顺序的原则是什么?
------解决思路----------------------

with cte as 
(select 1 as id,1 as uid1,2 as uid2 ,'你好'mess union all
select 2 as id,2 as uid1,1 as uid2 ,'你好啊'mess union all
select 3 as id,1 as uid1,2 as uid2 ,'想认识你'mess union all
select 4 as id,2 as uid1,1 as uid2 ,'你谁啊'mess union all
select 5 as id,1 as uid1,3 as uid2 ,'你好'mess union all
select 6 as id,4 as uid1,1 as uid2 ,'你好'mess ),
cte1 as 
(select ID, case when uid2=1 then uid2 else uid1 end as uid1,
  case when uid2=1 then uid1 else uid2 end as uid2,mess  from cte),
  cte2 as 
  (select id,uid1,uid2,mess,ROW_NUMBER()over(partition by uid2 order by id desc ) as n
   from cte1)

  select * from (select uid2 ,COUNT(uid2) over(partition by uid2 )as counts,mess,n
  from cte2 
  where uid1=1 )as p
  where N=1
--结果
uid2        counts      mess     n
----------- ----------- -------- --------------------
2           4           你谁啊      1
3           1           你好       1
4           1           你好       1
感觉先根据UID1,UID2聚合 然后进行自连接。链接条件 a.uid1=b.uid2 and a.uid2 =b.uid1也可以
  
 
  

------解决思路----------------------
引用:
请问希望结果中,
2  你谁啊 4 (总共有4次对话,最后一次是“你谁啊”)  --> 统计的是用户1的最后消息记录,这其中的2,4是怎么来的?
3  你好  1(总共只有1次对话,1发给3的)  --> 1发给3的  顺序是 3 [内容] 1
4  你好  1 (总共只有1次对话,4发给1的) --> 4发给1的  但顺序是 4 [内容] 1  请问结果中确定前后顺序的原则是什么?

2 事表示用户1和2对话。4表示他们之间的对话次数,(只是他们之间。不管发送的顺序),顺序就是UID1发送给UID2
------解决思路----------------------
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参与的对话中的 人员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 
  相关解决方案