使用MySQL来选择类似于Amazon的SimpleDB的属性

时间:2011-08-01 16:09:55

标签: mysql select self-join

抱歉,我想不出一个更好的方法来标题。在Amazon的SimpleDB中,项目可以在同一列中具有多个值,因此可以仅选择具有所有要搜索的属性的项目。

在MySQL中,假设下表(“Photo_Attributes”)包含另一个表(“Photos”)中包含的照片的无限数量的属性,并且这两个表由Item_Number连接。

并且,假设我想找到一个颜色为红色且尺寸为中等的帽子,在这种情况下,它将是ITEM_ID“ABC”而不是“OPQ”。

+-----+----------+--------+-----------+-------+  
| 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   |  
+-----+----------+--------+-----------+-------+  

以下查询不会产生任何结果,因为每行只包含一个属性和一个值。

  

SELECT FROM Photo_Attributes WHERE OBJECT ='hat'AND(Attribute ='Color“AND   值='红色')AND(属性='大小'和值='Med');


而且,这个查询会产生比它应该更多的行(即所有红色和所有中等大小的项目)。

  

SELECT FROM Photo_Attributes WHERE OBJECT ='hat'AND(Attribute ='Color“AND   值='红色')OR(属性='大小'和值='Med');


写这个的最好方法是什么 - 并且 - 有没有办法在SELECT语句中不使用JOIN?我想知道后者,因为查询将以编程方式生成(在nodejs中),属性 - 值对的数量可以从一个到几个。我想我也可以使用嵌套查询,从记录集中剔除,但这似乎同样效率低下。

1 个答案:

答案 0 :(得分: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