1

我的表格列出了 x 个用户之间的线程。每个用户可以在 y 个线程中。

下面,user_id 1在线程12,等等......

现在,假设user_id 1仅给出,我怎样才能获得与具有相同thread_id的行的所有行user_id 1

       id   user_id  thread_id
        1     1        1    
        2     1        2    
        3     2        1    
        4     3        2    

没有线索...


编辑

给定的是user_uids 1 和 2。现在给我只有他们两个共享的 thread_id。我不想要 1 和 2 的所有线程,而只想要它们一起共享的线程。

4

5 回答 5

2

如果要查找具有完全相同线程集的用户对,则以下查询将起作用:

select t.user_id, t2.user_id
from (select t.*, count(*) over (partition by t.user_id) as NumThreads
      from t
     ) t left outer join
     t t2
     on t.thread_id = t2.thread_id and t.user_id <> t2.user_id
group by t.user_id, t2.user_id
having SUM(case when t.user_id is null then 1 else 0 end) = 0 and
       SUM(case when t2.user_id is null then 1 else 0 end) = 0 and
       count(*) = max(t.NumThreads)

在这个查询中,无论它说“来自 t t2”,你都会输入“来自 t2”。行是“来自 t”的地方,你会放“来自 t”。

此查询的结构是带有聚合的自联接。意图找到每一对匹配的线程。然后按两个 user_id 对它们进行分组。如果匹配线程数是用户的线程数(第三个条件)并且没有线程匹配失败(前两个条件),则两个用户在所有线程上都匹配。

您在评论中关于所有用户线程的问题更容易。

select thread_id
from t cross join
     (select count(distinct user_id) as NumUsers from t) const
group by thread_id
having count(*) = max(const.NumUsers)
于 2013-02-28T22:11:34.767 回答
1
declare @id int
set @id = (select thread_id from threads where user_id = 1)

select * from threads where thread_id = @id
于 2013-02-28T22:07:44.317 回答
1
SELECT * FROM table
WHERE user_id!=1 AND
      thread_id IN (SELECT thread_id FROM table WHERE user_id=1);

基于印第安人编辑的问题描述的新答案:

SELECT * FROM table t1
JOIN table t2 ON t1.thread_id=t2.thread_id AND t1.user_id!=t2.user_id
WHERE t1.user_id IN (1,2) AND t2.user_id IN (1,2);
于 2013-02-28T22:12:51.913 回答
1
select distinct thread_id from tableX
where thread_id in (select thread_id from tableX where user_id=1)
and thread_id in (select thread_id from tableX where user_id=2)

我已修改我的答案以适合您的评论说明。试一试。

于 2013-02-28T22:13:04.600 回答
1

您可以使用EXISTS

DECLARE @userID INT 
SET @userID = 1 

SELECT u1.id, u1.user_id, u1.thread_id 
FROM   userthreads u1 
WHERE  u1.userid <> @userId 
       AND EXISTS(SELECT 1 
                  FROM   userthreads u2 
                  WHERE  u2.userid <> u1.userid 
                         AND u2.threadid = u1.threadid)

演示

如果要包含具有给定 userID 的用户,请省略WHERE u2.userid <> u1.userid.

于 2013-02-28T22:28:28.013 回答