0

抱歉,我想不出更好的方法来命名这个。在 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 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 中),并且属性值对的数量可以从一个到几个不等。我想我也可以使用嵌套查询,从记录集中剔除,但这似乎同样低效。

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'

假设您的名称/值对中没有重叠(例如,您永远不会有 Size/Red 或 Color/Med),您可能也可以这样做。

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 回答