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