1

次のテーブルがあります。

  • ウィジェット
  • 田畑
  • Widgets_Fields

ウィジェット テーブルは、id、user_id、追加/更新などを含む単純な製品/リスト テーブルです。

フィールド テーブルには、ウィジェットのフィールド名が一覧表示されます。フィールドの数に制限はありません (高さ、幅、価格、製造年、色など)。フィールド テーブル:

  • ID
  • 名前

各ウィジェットには、任意の数のフィールドと値を関連付けることができます。Widgets_Fields テーブルは次のようになります。

  • ID
  • field_id
  • widget_id
  • 価値

ウィジェットまたはウィジェットのグループのすべてのフィールドを取得したいだけの場合は、非常に簡単です。

select widget_id from widgets_fields where widget_id = xxx

しかし、ウィジェットを検索していて、フィールドに特定の値を持つウィジェットだけを見つけたい場合はどうすればよいでしょうか? 実行可能

select widget_id from widgets_fields where field_id = xxx and value = xxx

複数のフィールドに基づいてウィジェットを選択したいときに問題が発生します。たとえば、「赤」または「オレンジ」であり、かつ年が 2012 または 2011 であるすべてのウィジェット

select widget_id from widgets_fields where 
(field_id = xxx and (value = 'red' or value = 'orange')
and
(field_id = xxy and (value = 2012 or value = 2011)

これは不可能な場所を生み出します。あるいは、私はこのようなことをすることができます

select widget_id from widgets_fields where
field_id in (xxx, xxy)
and value in ('red', 'orange', 2012, 2011)

ただし、提供されたフィールドIDのいずれかで指定された値を探すため、必ずしも必要なものが返されるとは限りません。

最後に、私の質問は、これを達成するためのクエリを適切に作成する方法があるかどうかです。あるに違いないと確信していますが、私はしばらくの間それに取り組んできましたが、まだ解決策を考え出していません。

4

2 に答える 2

1
all widgets that are either 'red' or 'orange' 
AND also have a year of 2012 or 2011

サブクエリと結果を一緒に INNER JOIN することで実現できます

SELECT widget_id FROM
(SELECT widget_id FROM widgets_fields
WHERE field_id = 'color' and value in ('red', 'orange')) ResultSetA
INNER JOIN
(SELECT widget_id FROM widgets_fields
WHERE field_id = 'year' and value in (2011, 2012)) ResultSetB
ON ResultSetA.widget_id = ResultSetB.widget_id

簡単に言えば、これは「すべての赤とオレンジのウィジェットの ID を取得し、次に 2011 年または 2012 年のすべてのウィジェットの ID を取得し、両方のリストに表示される ID を教えてください。

于 2012-08-10T14:40:49.093 に答える
1

2つの方法がすぐに思い浮かびます。EXSISTS1 つは、サブクエリを使用することです。

select * from widgets where
    exists (select * from widgets_fields where field_id = xxx and (value = 'red' or value = 'orange') and widget_id=widgets.id)
    and exists (select * from widgets_fields where field_id = xxy and (value = 2012 or value = 2011) and widget_id=widgets.id)

もう 1 つはJOIN、サブクエリで s を使用することです。

select a.widget_id from
    (select widget_id from widgets_fields where field_id = xxx and (value = 'red' or value = 'orange')) a
    join (select widget_id from widgets_fields where field_id = xxy and (value = 2012 or value = 2011)) b
        on (a.widget_id=b.widget_id)

パフォーマンスについてはわかりません。おそらく、データの量とそこにあるインデックスに依存します。

于 2012-08-10T14:46:11.317 に答える