抱歉,我想不出更好的方法来命名此内容。在 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/