2016-07-05 29 views
0

を一致基準にエントリを検索し、EventEventTagSQL:私は2つのテーブルを持っている別のテーブルに

CREATE TABLE event (
    id INT PRIMARY KEY, 
    content TEXT 
) 

CREATE TABLE event_tag (
    event_id INT, 
    type VARCHAR(255), 
    value VARCHAR(255) 
) 

各イベントは、ゼロ以上のタグを持っています。私はSQLで表現したいクエリは次のとおりです。

は私に EventTag.type="foo" and EventTag.value="bar"にタグが関連付けられているすべての Event(テーブルのすべての列)を得ました。

hereに答えとして、参加して、どこで、例えば)これは1つのタグ基準のために簡単ですが、どのように私は2つの以上の基準の状況に取り組むのですか?そう: "bar"と関連するタグ "foo"と "!quux"と等しいイベントタグ "qux"を持つイベントを私にくれますか?私はタグテーブルに参加することを考えましたが、良いアイデアかどうかは分かりません。

+0

どのRDBMSを使用していますか? –

+0

私はテストにはH2を、プロダクションではPostgres 9.1を使用しています。 –

+0

[リレーショナル部門](https://www.simple-talk.com/sql/t-sql-programming/divided-we-stand-the-sql-of-relational-division/)別名「theすべての部品を供給するサプライヤ "と呼ばれています。 SQL/postrgreにはdivide演算子がありません。他の演算子と偽装する必要があります。必ずしも@TomHが示唆している方法である必要はありませんが、それは良いスタートです。 – onedaywhen

答えて

2

この問題を解決する最善の方法は、EAVデータベースモデル(Entity-Attribute-Value)を使用しないことです。あなたは、このアンチパターンで多くの問題のうちの最初のものに就いています。 「EAVモデル」の簡単なGoogle検索では、再設計しないことを選択した場合、店舗内の他の問題の一部が明らかになります。通常、Eventテーブルにはfooの列とquxの列が必要です。

あなたが主張(または強制されている)場合は、この道を行くために、使用できる一つの可能​​な解決策:

SELECT id, content 
FROM Event 
WHERE id IN 
(
    SELECT 
     E.id 
    FROM 
     Event E 
    INNER JOIN Event_Tag T ON 
     T.event_id = E.id AND 
     (
      (T.type = 'foo' AND T.value = 'bar') OR 
      (T.type = 'qux' AND T.value = 'quux') 
     ) 
    GROUP BY 
     E.id 
    HAVING 
     COUNT(*) = 2 
) 

あなたは、一時表またはCTEとしてあなたの様々なタイプ/値のペアを置く場合あなたはあなたが望むすべてのペアをリストするのではなく、JOINにすることができます。その構文はあなたのRDBMSに依存します。

+0

慎重に質問を読んでいただきありがとうございました。以前はEAVを聞いたことがありませんでしたが、私はそれを読んで再設計します。 –

0

Select id from EVENT ev INNER JOIN EVENT_TAG et ON ev.id = et.event_ID WHERE et.type = 'foo' AND et.value = 'bar'

明らかにあなたが欲しい、これまでどのような種類を見つけるために括弧の間にあなたが望むすべてのものを置くことができます。

+1

'bar'は値であり、タイプではありません – onedaywhen

+0

修正済み、逃した – MageeWorld

0

使用したり、複数のケース/基準のオペランド

SELECT * FROM Event e join Event_tag on e.eventId = et.eventtagid where ((EventTag.type="foo" and EventTag.value="bar") or (EventTag.type="po" and EventTag.value="yo")) 

または値がdyanmicであれば、あなたのプログラミング言語そのインターフェイスのSQLに応じて、あなたはJavaでたとえば、クエリ

を書くことができますIそれを使用することができます

SELECT * FROM Event e join Event_tag et on e.eventid = et.eventtagid where (EventTag.type=? and EventTag.value=?) 

ここでは、上記のSQL文字列をクエリに割り当てて、そのパラメータを設定します。

関連する問題