mysql - 使用MySQL SELECT属性类似于Amazon的SimpleDB

标签 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 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 中),并且属性值对的数量范围可以从一个到多个。我想我也可以使用嵌套查询,从记录集中剔除,但这似乎同样效率低下。

最佳答案

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

关于mysql - 使用MySQL SELECT属性类似于Amazon的SimpleDB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6901235/

相关文章:

MySQL从一张表计算百分比

mysql - 如何计算以下 SQL 代码的时间复杂度?

MYSQL:使用相同字段左连接同一个表两次

php - 将两个 Laravel 集合与交替的行组合起来

php - RedBean findOne 失败?

jquery - 为什么克隆 DIV 中的 SELECT 在刷新时会出现错误行为?

select - SELECT WHERE [primary key] = [primary key value] O(1)?

sql - 如何获得今年年初以来过去了多少天?

mysql - SQL 更新数据透视表并计算新列

sql - 如何删除SQL Server自连接中的重复行