34,594
社区成员
发帖
与我相关
我的任务
分享
if object_id('tempdb..#test') is not null
drop table #test
create table #test(id int identity,sendUserID int,recvUserID int,content varchar(100))
insert into #test
select 1, 2, '2号你好' union all
select 1, 3, '3号你好' union all
select 1, 4, '4号你好' union all
select 4, 1, '我是4号,1号你好烦' union all
select 2, 1, '我是2号,1号你好烦'
--select * from #test
select case when senduserid=1 then recvuserid else senduserid end talkAboutuserid,content,id from (
select id,'-'+cast(sendUserid as varchar)+'-'+cast(recvUserid as varchar)+'-' as liao,content,
sendUserid,recvUserid
from #test
)t where not exists (select * from #test where charindex('-'+cast(recvuserid as varchar)+'-',t.liao)>0
and charindex('-'+cast(senduserid as varchar)+'-',t.liao)>0
and id>t.id) order by id desc
/*
2 我是2?,1?你好? 5
4 我是4?,1?你好? 4
3 3?你好 2
*/
IF OBJECT_ID('tempdb..#Users') IS NOT NULL
BEGIN
DROP TABLE #Users;
END
GO
CREATE TABLE #Users
(
Id INT IDENTITY(1, 1)
NOT NULL
PRIMARY KEY ,
Name VARCHAR(50) NOT NULL
);
GO
INSERT INTO #Users
VALUES ( 'zhangsan' ),
( 'lisi' ),
( 'wangwu' ),
( 'zhaoliu' );
GO
IF OBJECT_ID('tempdb..#Messages') IS NOT NULL
BEGIN
DROP TABLE #Messages;
END
GO
CREATE TABLE #Messages
(
id INT IDENTITY ,
sendUserID INT ,
recvUserID INT ,
content VARCHAR(100)
);
GO
INSERT INTO #Messages
VALUES ( 1, 2, '我是3号,2号你好' ),
( 1, 3, '3号你好' ),
( 1, 4, '4号你好' ),
( 4, 1, '我是4号,1号你好烦' ),
( 2, 1, '我是2号,1号你好烦' ),
( 3, 2, '我是3号,2号你好' );
GO
SELECT *
FROM #Users;
SELECT *
FROM #Messages;
GO
/*
查询标识为1的用户和其它用户的最后聊天记录;
*/
DECLARE @id INT = 1;
SELECT t.*
FROM #Users AS u
CROSS APPLY ( SELECT TOP 1
*
FROM #Messages AS m
WHERE ( u.Id = m.sendUserId
OR u.id = m.recvUserID
)
AND ( m.sendUserID = @id
OR m.recvUserID = @id
)
ORDER BY id DESC
) AS t
WHERE u.id <> @id
ORDER BY t.id DESC;
GO
create table #test(id int identity,sendUserID int,recvUserID int,content varchar(100))
insert into #test
select 1, 2, '2号你好' union
select 1, 3, '3号你好' union
select 1, 4, '4号你好' union
select 4, 1, '我是4号,1号你好烦' union
select 2, 1, '我是2号,1号你好烦' union
select 1, 2, '2号你好222222' union
select 1, 3, '3号你好333333' union
select 1, 4, '4号你好44444' union
select 4, 1, '我是4号,1号你好烦444444' union
select 1, 3, '3号你好xxxxxxxxxx' union
select 1, 4, '4号你好xxxxxxx' union
select 4, 1, '我是4号,1号你好烦xxxxxxx' union
select 2, 1, '我是2号,1号你好烦222222'
select
a.sendUserID as talkAboutUserID,a.content,a.id
from #test a inner join
(
select
senduserid,recvuserid,max(id) as id
from #test group by sendUserID,recvuserid
) b on a.id=b.id
order by a.id desc
[/quote]
谢谢, 但是结果不是这样的, 你看QQ的最近聊天人列表, 不管是我对他人说话, 还是他人对我说话,都算对话,然后按对话的时间倒序;
也就是说,如果1号是我, 我和2,,3,4号对话过,那么;
需要的结果集里面就3条记录;
create table #test(id int identity,sendUserID int,recvUserID int,content varchar(100))
insert into #test
select 1, 2, '2号你好' union
select 1, 3, '3号你好' union
select 1, 4, '4号你好' union
select 4, 1, '我是4号,1号你好烦' union
select 2, 1, '我是2号,1号你好烦' union
select 1, 2, '2号你好222222' union
select 1, 3, '3号你好333333' union
select 1, 4, '4号你好44444' union
select 4, 1, '我是4号,1号你好烦444444' union
select 1, 3, '3号你好xxxxxxxxxx' union
select 1, 4, '4号你好xxxxxxx' union
select 4, 1, '我是4号,1号你好烦xxxxxxx' union
select 2, 1, '我是2号,1号你好烦222222'
select
a.sendUserID as talkAboutUserID,a.content,a.id
from #test a inner join
(
select
senduserid,recvuserid,max(id) as id
from #test group by sendUserID,recvuserid
) b on a.id=b.id
order by a.id desc
create table #test(id int identity,sendUserID int,recvUserID int,content varchar(100))
insert into #test
select 1, 2, '2号你好' union
select 1, 3, '3号你好' union
select 1, 4, '4号你好' union
select 4, 1, '我是4号,1号你好烦' union
select 2, 1, '我是2号,1号你好烦'
select
a.sendUserID as talkAboutUserID,a.content,a.id
from #test a inner join
(
select
senduserid,max(id) as id
from #test group by sendUserID
) b on a.id=b.id
order by a.id desc
结果:
talkAboutUserID content id
4 我是4号,1号你好烦 5
2 我是2号,1号你好烦 4
1 4号你好 3[/quote]
不对呀, 1号和3号的聊天没了
结果集需要的是
4 我是4号,1号你好烦 5
2 我是2号,1号你好烦 4
3 3号你好 3
create table #test(id int identity,sendUserID int,recvUserID int,content varchar(100))
insert into #test
select 1, 2, '2号你好' union
select 1, 3, '3号你好' union
select 1, 4, '4号你好' union
select 4, 1, '我是4号,1号你好烦' union
select 2, 1, '我是2号,1号你好烦'
select
a.sendUserID as talkAboutUserID,a.content,a.id
from #test a inner join
(
select
senduserid,max(id) as id
from #test group by sendUserID
) b on a.id=b.id
order by a.id desc
结果:
talkAboutUserID content id
4 我是4号,1号你好烦 5
2 我是2号,1号你好烦 4
1 4号你好 3
if object_id('tempdb..#test') is not null
drop table #test
create table #test(id int identity,sendUserID int,recvUserID int,content varchar(100))
insert into #test
select 1, 2, '2号你好' union
select 1, 3, '3号你好' union
select 1, 4, '4号你好' union
select 4, 1, '我是4号,1号你好烦' union
select 2, 1, '我是2号,1号你好烦'
--select * from #test
select case when senduserid=1 then recvuserid else senduserid end talkAboutuserid,content,id from (
select id,'-'+cast(sendUserid as varchar)+'-'+cast(recvUserid as varchar)+'-' as liao,content,
sendUserid,recvUserid
from #test
)t where not exists (select * from #test where charindex('-'+cast(recvuserid as varchar)+'-',t.liao)>0
and charindex('-'+cast(senduserid as varchar)+'-',t.liao)>0
and id>t.id) order by id desc
select sendUserID as talkAboutUserID,content,id from [聊天表] order by id desc
就order by id 不就行了嘛?