是这样,我有张表,字段是这样的
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 事表示用户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