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 = '周六' )
用case when 如果是这个组最大的sort 就取0 否则就sort
@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 ))
sort<>t.sort这个条件不对
假设已经存在一个这样的组,张三》李四》周六》李八
虽然张三和周六曾经在一个组呆过,但他们没有发生过讲话
楼上的答案也会将这个组判断成讲过话
1楼的abs(sort-t.sort)=1 这样呢?
这张表包含了:ID 、谈话者userid 、被谈话者userid 、谈话时间
当符合谈话规则(同一TeamId ,当谈话者@Sort<>Max(Sort) 时,被谈话者Sort =谈话者@Sort +1,当谈话者@Sort=Max(Sort) 时,被谈话者Sort=Min(Sort) )的两个userid 谈话后,记录到[谈话记录表]
然后在[谈话记录表]中的纪录即为谈过话的
abs(sort-t.sort)=1不完全对,因为在一个组中,如果两个人是一头一尾谈过话,Sort不是1的关系
你的方法我也想过,但如果不借住另外的表,有没有方法来解决呢
TeamId UserId UserName Sort
1 39 张三 1
1 56 李四 2
1 22 王五 3
上述数据中,王五和张三谈过话,但Sort相差是2,而不是1
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 = '周六'
)
用case when 如果是这个组最大的sort 就取0 否则就sort
如何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
))