2017-12-30 24 views
0

は、私は私のDBには、次の表を持っている:私はpersonID 5と6すぎず、他のpersonIDの両方を含む各groupIDを返すクエリを把握しようとしている特定のIDのみを持ち、他のIDは持たないレコードで共通の列を照会しますか?

people_to_groups 

id | personID | groupID 
------------------------- 
1 | 5  | 2 
------------------------- 
2 | 6  | 2 
------------------------- 
3 | 7  | 3 
------------------------- 
4 | 5  | 3 
------------------------- 
5 | 5  | 4 
------------------------- 
6 | 5  | 7 
------------------------- 
7 | 6  | 7 

クエリは、上記の表で実行されていたのであれば、それは次の結果セットが返されます:グループは2と7は、人物5と6となし、他の人の両方を持っている唯一のグループであるため、

groupID 
------- 
2 
------- 
7 

を。

(PS誰もがより良いタイトルを考えることができれば編集を示唆して行ってください)グループIDが5と6の両方を持っている、あなたはこれらの3つのルールを使用できることを確認するには

+0

データセットはあまり代表的ではありません – Strawberry

答えて

1

answer by Vashiは涼しいですが、あなたの選択グループが連続しているときにのみ、5 & 6または5例えば(それを使用することができています6 & 7ではなく、5 & 8)。すべてのケースをカバーするには、要件の簡単な翻訳を使用することができます。

SELECT DISTINCT groupID 
FROM people_to_groups 
WHERE personID = 5 
    AND groupID IN (SELECT groupID 
        FROM people_to_groups 
        WHERE personID = 6) 
    AND groupID NOT IN (SELECT groupID 
         FROM people_to_groups 
         WHERE personID NOT IN (6 , 5)); 

これは理解しやすい、5用のすべてのグループを選択し、6のグループを追加し、最終的には他の数字のためにすべてのグループを削除します。

SELECT groupID 
FROM people_to_groups 
WHERE personID IN (6 , 5) 
    AND groupID NOT IN (SELECT groupID 
         FROM people_to_groups 
         WHERE personID NOT IN (6 , 5)) 
GROUP BY groupID 
HAVING COUNT(DISTINCT personID) = 2; 

だからここに同じ考え、私たちはグループを探しているだけ持つ2つの異なる番号:あなたはヴァシの答えでグループ化のアイデアを好きなら

あるいは、あなたはすべてのケースをカバーするためにそれを変更することができますこれらの2つの数値を5 & 6と定義します。ここでの唯一の違いは、5 & 6を範囲(すなわち、min = 5およびmax = 6)として定義する代わりに、実際に検索を5 & 6に制限し、他のすべての数字。

2つのソリューションのどちらを使用するかは、状況によって異なります。最初のものは分かりやすく分かりやすいですが、選択グループにいくつかの番号がある場合(例:5 10)、多くのサブクエリが発生します。その場合、2番目のソリューションは同じままになるため、さらに管理しやすくなります。IN()NOT IN()の部分に必要な番号をすべて追加するだけです。

+0

2番目の解決策では、最後の行を変更する必要があります。選択グループのpersonIDの数に正しく? – saricden

3

を:
1 - マックスは6です
2 - 分は5
3である - 個別PERSONIDのカウントは2

SELECT groupID 
FROM people_to_groups 
GROUP BY groupID 
HAVING MAX(personID) = 6 
    AND MIN(personID) = 5 
    AND COUNT(DISTINCT personID) = 2; 
+0

完全性のために '=最大(6,5)'はより明らかにスケーラブルです – Strawberry

関連する問題