场景:
建组讲话,比如张三、李四、王五,被分配到一个组中进行谈话
张三对李四讲,李四对王五讲,王五对张三讲,形成一个闭环讲话
张三》李四》王五》张三
示例数据如下,Sort是讲话的顺序
TeamId UserId UserName Sort
1 39 张三 1
1 56 李四 2
1 22 王五 3
下面我再建一个组,比如周六,赵七,李八被分配一个组谈话
周六对赵七讲,赵七对李八讲,李八对周六讲,同样形成一个闭环
周六》赵七》李八》周六
示例数据变成了这样:
TeamId UserId UserName Sort
1 39 张三 1
1 56 李四 2
1 22 王五 3
2 89 周六 1
2 65 赵七 2
2 35 李八 3
.
.
.
假如这样的组有N个,下面问题来了
我现在又建一个组,将张三分配到组中(组中只有一个人时不判断),再将周六分配到组中(这时有两个人了),这时我要判断,周六有没有和张三发生过谈话,也就是将张三和周六同时放到数据库中查询有没有发生过讲话,如果发生过,则返回张三和周六的UserId,如果没有发生过,则返回空;然后我又将王五分配到组中(这时三个人了),将王五分别和张三、周六再作验证,是不是和他们也讲过话,如果讲过的,返回他们的UserID,如果没有讲过则返回空
请问这个判断的SQL怎么写比较快(一个组中最多是四个人,不少于三个人)
------解决方案--------------------
我要判断,周六有没有和张三发生过谈话
这个是依据什么来判断的?
------解决方案--------------------
create table DiscussGroup(TeamId int,UserId int,UserName nvarchar(100),Sort int)
go
insert into DiscussGroup
values
(1 , 39, N'张三' , 1),
(1 , 56, N'李四' , 2),
(1 , 22, N'王五' , 3),
(1 , 23, N'钱二' , 4),
(2 , 89, N'周六' , 1),
(2 , 65, N'赵七' , 2),
(2 , 35, N'李八' , 3)
go
; with t as
(
select teamid,userid,username,Sort from DiscussGroup dg
where exists(select 0 from DiscussGroup where UserName=N'张三' and TeamId=dg.TeamId)
),
ts as
(
select teamid,max(sort) as maxsort,min(sort) as minsort from t group by teamid
)
select t1.TeamId,t1.UserName,t1.Sort,t2.Sort,t2.UserName,ts.minsort,ts.maxsort from t t1 join t t2 on t1.TeamId=t2.TeamId join ts on t1.TeamId=ts.TeamId and t1.UserName=N'钱二'
and (t1.Sort=t2.Sort+1 or t1.Sort=t2.Sort-1 or (t1.Sort in(ts.maxsort,ts.minsort) and t2.Sort in(ts.minsort,ts.maxsort)) ) and t2.UserName=N'王五'
------解决方案--------------------
with table1 as
(select t1.TeamId,t1.UserId as userid39,t1.UserName as username39
,t1.Sort as sort39 ,t2.UserId as userid89,t2.UserName as username89,
t2.Sort as sort89 from DiscussGroup as t1
join DiscussGroup as t2 on t1.teamid=t2.teamid
and t1.UserId<t2.UserId
where (t1.userid='39' and t2.userid='56')or
(t1.userid='56' and t2.userid='39') ),
table2 as
(select teamid ,MAX(sort)as maxsort from
DiscussGroup group by TeamId )
select * from table1 as t1 join table2 as t2
on t1.TeamId=t2.TeamId
where t1.sort39=sort89+1 or
t1.sort89=sort39+1 or
(t1.sort39=1 and t1.sort89=t2.maxsort) or
(t1.sort89=1 and t1.sort39=t2.maxsort)
------解决方案--------------------
重复提问,楼主消失了。