当前位置: 代码迷 >> Sql Server >> 貌似简单,却是超级难题,有高手来挑战吗
  详细解决方案

貌似简单,却是超级难题,有高手来挑战吗

热度:71   发布时间:2016-04-24 10:05:15.0
看似简单,却是超级难题,有高手来挑战吗
场景:
建组讲话,比如张三、李四、王五,被分配到一个组中进行谈话
张三对李四讲,李四对王五讲,王五对张三讲,形成一个闭环讲话
张三》李四》王五》张三
示例数据如下,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)
------解决方案--------------------
重复提问,楼主消失了。
  相关解决方案