2016-05-16 12 views
1

すべてのタグが与えられたデータベース内のすべての行を取得するクエリMySQLを作成しようとしています。(A、B、Z)IN(A、B、C、E、Z)

WHERE "tag1" IN (SELECT tag FROM tag_list WHERE client.id = tag_list.id) 

これはつのタグのため正常に動作しますが、私は複数のタグを持っている場合、私はので、このクエリを貼り付け何度もコピーしてANDでそれらを結合したくない:私はこれを持っている時点では

すべてのタグを複数回選択するのが遅いようです。

このようなことができる方法はありますか? TAG1、TAG2、TAG3:私のクライアントはすべてのタグを持っていることを意味

WHERE ("tag1", "tag2", "tag3") IN (SELECT tag FROM tag_list WHERE client.id = tag_list.id) 

最後のクエリを実行しようとすると、私はこのエラーを受け取ります:Operand should contain 3 column(s)

だから、私の現在のソリューションは、このようなものになるだろう:

WHERE "tag1" IN (SELECT tag FROM tag_list WHERE client.id = tag_list.id) 
AND "tag2" IN (SELECT tag FROM tag_list WHERE client.id = tag_list.id) 
AND "tag3" IN (SELECT tag FROM tag_list WHERE client.id = tag_list.id) 

全く最適ないないようです。

テーブル構造:

client [id, name] 
tag_list [FK id references client.id, tag] 

したがって、各クライアントが複数のタグを持つことができ、私は与えられたすべてのタグを持つクライアントを取得したいです。

+0

あなたはSELECT * FROMクライアントLEFT JOINを使用できませんtag_list ON tag_list.id = client.id tag1はNULLではなく、tag2はNULLではなく、tag3はNULLではありません。 ' – Justinas

+0

'tag1'は列名ではありません。 'tag_list'テーブルの' tag'カラムの行の値です。 – Cristy

+0

http://stackoverflow.com/questions/31860162/mysql-select-groups-having-values-covering-a-setを見てください。 – Solarflare

答えて

2

サブクエリを省略あなたはいいはずです:

JOIN tag_list tag1 ON client.id = tag1.id AND tag1.tag = "tag1" 
JOIN tag_list tag2 ON client.id = tag2.id AND tag2.tag = "tag2" 
JOIN tag_list tag3 ON client.id = tag3.id AND tag3.tag = "tag3" 

私はこれを行うより効率的な方法を本当に考えることができません。 MySQLはこれを簡単に最適化できるはずです。

+0

ところで、おそらくあなたは本当に正しいです! :-) – Alex

+0

これは必ずしも高速ではなく、複数の 'IN()' – sagi

+0

ですが、私の 'HAVING'の方が速いかもしれません。私は何も見えません* IN()*ただ一つしかありません。 – Alex

1

ようINNER JOINWHEREを置き換えます

INNER JOIN tag_list 
ON client.id = tag_list.id 
AND tag_list.tag IN ("tag1","tag2","tag3") 

UPDATEと私が正しくあなたを得た場合、あなたはすべての3個のタグでクライアントのみを一緒に取得したい:

INNER JOIN tag_list 
ON client.id = tag_list.id 
AND tag_list.tag IN ("tag1","tag2","tag3") 
GROUP BY client.id 
HAVING COUNT(DICTINCT tag_list.tag)=3 
+0

これが大きなクエリの一部である場合、これは問題になります – sagi

+0

@sagiいくつかの詳細で表示される問題を指摘できますか? – Alex

+0

はい、4つの異なるテーブルから10の他の列が必要だとしたら、彼はそのグループをどうやってやりますか?あなたは実際のものを見ずに彼の質問を変更しました。あなたが彼自身によってこの変更を行うことができるかどうか、あなたはどのように確信できますか? – sagi

関連する問題