2017-05-29 6 views
2

したがって、私はクライアントテーブルとタグテーブルを持っています。 1つのクライアントに多数のタグがあります。 特定のタグセットを持つすべてのクライアントを選択したいとします。例えば 、このような問合せは1、9、または両方を1と9MySQL:配列コンパイル

を持っているすべてのクライアントを返しますので、のは、私のために動作しませんID 1と9

SELECT clients.id from clients 
INNER JOIN tags ON clients.id = tags.client_id 
WHERE tags.id IN (1, 9) 
GROUP BY clients.id 

これを持つタグを持っているすべてのクライアントを選択してみましょう

1と9の両方を持つクライアントはどのように返すことができますか?

+0

ダブル参加しますか...? –

+0

@Jens:そうですが、ここではそうではありません。 –

+0

サンプルデータを表示 – Jens

答えて

1

あなたはHAVINGを使用して、以下のソリューションを使用することができます。

SELECT clients.id FROM clients 
INNER JOIN tags ON clients.id = tags.client_id 
WHERE tags.id IN (1, 9) 
GROUP BY clients.id 
HAVING COUNT(DISTINCT tags.id) = 2 

デモ:http://sqlfiddle.com/#!9/7e4d20/1/0

このクエリは(1と9ではない1またはその両方を持っている行を返します。 9)タグ。 INのタグ数を変更する場合は、HAVINGの番号も変更する必要があります。

+0

それは私のために働く、ありがとう! –

1

あなたはすでに答えを受け入れたとしても、ここでもう一つの変異体である:

SELECT clients.id 
FROM clients 
LEFT JOIN tags ON clients.id = tags.client_id 
WHERE tags.id IN (1, 9); 
+0

ありがとう、それはまたよさそうだ! –

+0

@ LuninRomanよろしくお願いします。覚えておいてください: "_Iすべてのクライアントが必要です..."で始まる場合、 'clients'はLEFTの" main "テーブルであり、すべてのレコードが表示されます(必要に応じて' WHERE'節でフィルタリングされます)。そして、あなたが "_that have tags ... _"を続けると、その中の各レコードに 'tags'の詳細を結合します。したがって、 'tags'の詳細はLEFTテーブルにJOINされます。 –