1

私のテーブルには、x ユーザー間のスレッドがリストされています。各ユーザーは y スレッドに入ることができます。

以下、user_id 1スレッド内12など...

さて、ある行だけが与えられたとしましょう。ある行とuser_id 1同じ行をすべて取得するにはどうすればよいですか?thread_iduser_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)

このクエリでは、「from t t2」とある場合は常に「from t2」と入力します。行が「from t」の場合は、「from t」と入力します。

このクエリの構造は、集計による自己結合です。一致するスレッドのすべてのペアを見つけるという意図。次に、それらを 2 つの user_id でグループ化します。一致するスレッドの数がユーザーのスレッドの数であり (3 番目の条件) 一致しないスレッドがない場合 (最初の 2 つの条件)、2 人のユーザーはすべてのスレッドで一致します。

すべてのユーザーのスレッドに関するコメントでの質問は簡単です。

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 に答える