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

loveyzy 2014-08-14 08:19:51
场景:
建组讲话,比如张三、李四、王五,被分配到一个组中进行谈话
张三对李四讲,李四对王五讲,王五对张三讲,形成一个闭环讲话
张三》李四》王五》张三
示例数据如下,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怎么写(一个组中最多是四个人,不少于三个人)
...全文
329 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhendemo_13 2014-08-15
  • 打赏
  • 举报
回复
我认为楼主提供的是[谈话组分配表], 需要建立一张[谈话记录表], 这张表包含了:ID 、谈话者userid 、被谈话者userid 、谈话时间 当符合谈话规则(同一TeamId ,当谈话者@Sort<>Max(Sort) 时,被谈话者Sort =谈话者@Sort +1,当谈话者@Sort=Max(Sort) 时,被谈话者Sort=Min(Sort) )的两个userid 谈话后,记录到[谈话记录表] 然后在[谈话记录表]中的纪录即为谈过话的
哥眼神纯洁不 2014-08-15
  • 打赏
  • 举报
回复
引用 2 楼 loveyzy 的回复:
楼上的答案是不对的 sort<>t.sort这个条件不对 假设已经存在一个这样的组,张三》李四》周六》李八 虽然张三和周六曾经在一个组呆过,但他们没有发生过讲话 楼上的答案也会将这个组判断成讲过话
1楼的abs(sort-t.sort)=1 这样呢?
loveyzy 2014-08-15
  • 打赏
  • 举报
回复
楼上的答案是不对的 sort<>t.sort这个条件不对 假设已经存在一个这样的组,张三》李四》周六》李八 虽然张三和周六曾经在一个组呆过,但他们没有发生过讲话 楼上的答案也会将这个组判断成讲过话
哥眼神纯洁不 2014-08-15
  • 打赏
  • 举报
回复
引用 10 楼 loveyzy 的回复:
@sc273607742, 如何case when,能写SQL看看吗
用1楼的sql改了改

select * from tab t
where username='张三' and exists(select 
* from tab tb where teamid=t.teamID and username='王五' and (abs(sort-t.sort)=1 or
(t.Sort-case when tb.Sort=(select MAX(sort) from tab where TeamId=tb.TeamId) then 0 else tb.Sort end)=1 or
(tb.Sort-case when t.Sort=(select MAX(sort) from tab where TeamId=t.TeamId) then 0 else t.Sort end)=1 
))
loveyzy 2014-08-15
  • 打赏
  • 举报
回复
@sc273607742, 如何case when,能写SQL看看吗
哥眼神纯洁不 2014-08-15
  • 打赏
  • 举报
回复
引用 5 楼 loveyzy 的回复:
@sc273607742, abs(sort-t.sort)=1不完全对,因为在一个组中,如果两个人是一头一尾谈过话,Sort不是1的关系
用case when 如果是这个组最大的sort 就取0 否则就sort
Tiger_Zhao 2014-08-15
  • 打赏
  • 举报
回复
SELECT TOP 1 userid
FROM (
SELECT t.userid,
t_next.username as nextuser,
t_first.username as firstuser
FROM tab t
LEFT JOIN tab t_next
ON t_next.teamid=t.teamid
AND t_next.sort=t.sort+1
LEFT JOIN tab t_first
ON t_first.teamid=t.teamid
AND t_first.sort=1
WHERE t.username = '张三'
) T
WHERE nextuser = '周六'
OR ( nextuser IS NULL
AND firstuser = '周六'
)
loveyzy 2014-08-15
  • 打赏
  • 举报
回复
我解释一下一头一尾 TeamId UserId UserName Sort 1 39 张三 1 1 56 李四 2 1 22 王五 3 上述数据中,王五和张三谈过话,但Sort相差是2,而不是1
loveyzy 2014-08-15
  • 打赏
  • 举报
回复
@zhendemo_13, 你的方法我也想过,但如果不借住另外的表,有没有方法来解决呢
loveyzy 2014-08-15
  • 打赏
  • 举报
回复
@sc273607742, abs(sort-t.sort)=1不完全对,因为在一个组中,如果两个人是一头一尾谈过话,Sort不是1的关系
习惯性蹭分 2014-08-14
  • 打赏
  • 举报
回复
帮顶一下。

 
select userid from tab t
where username='张三' and exists(select 
* from tab where teamid=t.teamID and username='周六' and sort<>t.sort)

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧