申し訳ありませんが、これにタイトルを付けるためのより良い方法は考えられませんでした。AmazonのSimpleDBでは、アイテムは同じ列に複数の値を持つことができるため、求められているすべての属性を持つアイテムのみを選択することができます。
MySQLで、次のテーブル( "Photo_Attributes")に、別のテーブル( "Photos")に含まれる写真の属性が無制限に含まれ、2つのテーブルがItem_Numberで結合されているとします。
そして、色が赤でサイズが中程度の帽子を見つけたいとしましょう。この場合は、「OPQ」ではなくITEM_ID「ABC」になります。
+-----+----------+--------+-----------+-------+
| ID | Item_ID | Object | Attribute | Value |
+-----+----------+--------+-----------+-------+
| 1 | ABC | Hat | Color | Red |
+-----+----------+--------+-----------+-------+
| 2 | FGH | Pants | Color | Blue |
+-----+----------+--------+-----------+-------+
| 3 | FGH | Pants | Size | Large |
+-----+----------+--------+-----------+-------+
| 4 | LMN | Shirt | Color | Red |
+-----+----------+--------+-----------+-------+
| 5 | ABC | Hat | Size | Med |
+-----+----------+--------+-----------+-------+
| 6 | LMN | Shirt | Size | Med |
+-----+----------+--------+-----------+-------+
| 7 | OPQ | Hat | Color | White |
+-----+----------+--------+-----------+-------+
| 8 | OPQ | Hat | Size | Med |
+-----+----------+--------+-----------+-------+
次のクエリでは、各行に1つの属性と1つの値しか含まれていないため、結果は得られません。
SELECT FROM Photo_Attributes WHERE OBJECT ='hat' AND(Attribute ='Color "AND Value ='Red")AND(Attribute ='Size' AND Value ='Med');
また、このクエリは、必要以上の行を生成します(つまり、すべての赤とすべての中型のアイテム)。
SELECT FROM Photo_Attributes WHERE OBJECT ='hat' AND(Attribute ='Color "AND Value ='Red")OR(Attribute ='Size' AND Value ='Med');
これを書くための最良の方法は何ですか-そして-SELECTステートメントでJOINを使用せずにそれを行う方法はありますか?クエリはプログラムで(nodejsで)生成され、属性と値のペアの数は1から数の範囲になる可能性があるため、後者については疑問に思っています。レコードセットからカリングするネストされたクエリも使用できると思いますが、それも同様に非効率的です。