2

これは私の会話テーブルです:

conversationID  ||  userID
      1         ||    1
      1         ||    2
      2         ||    1
      2         ||    2
      2         ||    3

ご覧のとおり、各会話には2人以上のユーザーを含めることができます。

2人のユーザーしかいない会話のIDを取得しようとしています。つまり、ユーザー1と2のみを含む会話、答えは会話1です。

しかし、どうすれば入手できますか?

4

3 に答える 3

2

これがお役に立てば幸いです。

select conversationID from conversation
group by ConversationID having count(distinct UserID)=2;

sqlfiddleデモ

于 2012-12-17T07:32:44.833 に答える
2

持っている句を使用する必要があります。(conversationID、userID)がPKまたはAKであるとすると、クエリは次のようになります。

  select   conversationID
    from   your_Table
group by   conversationID
  having   count( * ) = 2

編集済み1,2のユーザー会話に参加しました。これは、相関サブクエリがなく、行ごとの関数がない、インデックスに適したアプローチです。

      select   t1 conversationID
        from   your_Table t1
  inner join 
               ( select distinct conversationID
                  from your_Table
                 where userId in (1, 2)
               ) t2
          on   t1.conversationID = t2.conversationID
    group by   t1.conversationID
      having   count( distinct t1.userId ) = 2
于 2012-12-16T20:15:16.770 に答える
2

これにより、ユーザー 1 またはユーザー 2、またはその両方が含まれ、他のユーザーが含まれていないすべての会話が選択されます。

select conversationID
from conversations
group by conversationID
having count(*) = count(case when userID in (1,2) then 1 end)

ユーザー 1 と 2 だけが含まれ、他のユーザーがいないすべての会話も必要な場合は、and 条件も追加する必要があります。

select conversationID
from conversations
group by conversationID
having count(*) = count(case when userID in (1,2) then 1 end)
       and count(*) = 2 -- number of elements in set

userID を複製できる場合は、distinct を使用することもお勧めします。

select conversationID
from conversations
group by conversationID
having
  count(distinct userID) = count(distinct case when userID in (1,2) then userID end)
  and count(distinct userID) = 2 -- number of elements in set
于 2012-12-16T21:28:37.003 に答える