0

申し訳ありませんが、これにタイトルを付けるためのより良い方法は考えられませんでした。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から数の範囲になる可能性があるため、後者については疑問に思っています。レコードセットからカリングするネストされたクエリも使用できると思いますが、それも同様に非効率的です。

4

1 に答える 1

1
SELECT pa1.Item_ID
    FROM Photo_Attributes pa1
        INNER JOIN Photo_Attributes pa2
            ON pa1.Item_ID = pa2.Item_ID
                AND pa2.Attribute = 'Size'
                AND pa2.Value = 'Med'
    WHERE pa1.Object = 'Hat'
        AND pa1.Attribute = 'Color'
        AND pa1.value = 'Red'

名前と値のペアに重複がないと仮定すると(たとえば、サイズ/赤または色/中程度になることはありません)、おそらくこのようなこともできます。

SELECT pa.Item_ID
    FROM Photo_Attributes pa
    WHERE pa.Object = 'Hat'
        AND pa.Attribute IN ('Size', 'Color')
        AND pa.Value IN ('Med', 'Red')
    GROUP BY pa.Item_ID
    HAVING COUNT(DISTINCT Value) = 2
于 2011-08-01T16:17:05.303 に答える