我有以下表格结构:
产品(id、名称……)
+-----+------------+
| id | name |
+-----+------------+
| 1 | Product #1 |
| 2 | Product #2 |
| 3 | Product #3 |
| 4 | Product #4 |
+-----+------------+
属性(id、标题…)
+-----+------------+
| id | title |
+-----+------------+
| 1 | shape |
| 2 | colour |
| 3 | height |
| 4 | weight |
+-----+------------+
选项(id、标题…)
+-----+------------+
| id | title |
+-----+------------+
| 1 | round |
| 2 | square |
| 3 | oval |
| 4 | red |
| 5 | blue |
| 6 | green |
| 7 | tall |
| 8 | short |
| 9 | heavy |
| 10 | light |
+-----+------------+
第四个(productattribute-id、product\u id、attribute\u id、option\u id),希望得到“所有又高又重的红色圆形产品”:
+-----+------------+--------------------+
| id | product | attribute | option |
+-----+------------+--------------------+
| 1 | Product #1 | shape | round |
| 2 | Product #2 | shape | oval |
| 3 | Product #3 | shape | round |
| 4 | Product #4 | shape | square |
| 5 | Product #1 | color | green |
| 6 | Product #2 | color | red |
| 7 | Product #3 | height | tall |
| 8 | Product #4 | height | short |
| 9 | Product #2 | weight | heavy |
| 10 | Product #1 | weight | light |
+-----+------------+--------------------+
我还不是sql高手,也许我的想法行不通。
编辑:
问题1。问题是我如何做到这一点?比如所有的红色,高,重的产品。
以下查询没有达到我的目的:
1:
SELECT ProductAttributes.product_id, ProductAttributes.id FROM ProductAttributes
WHERE (ProductAttributes.attribute_id = 1 AND ProductAttributes.option_id = 1)
AND (ProductAttributes.attribute_id = 3 AND ProductAttributes.option_id = 4);
2:
SELECT DISTINCT ProductAttributes.product_id, ProductAttributes.id FROM ProductAttributes
WHERE (ProductAttributes.attribute_id = 1 AND ProductAttributes.option_id = 1)
OR (ProductAttributes.attribute_id = 3 AND ProductAttributes.option_id = 4);
注意:我有意在我的查询中放入2个变量,因为真正的变量还有很多。
4条答案
按热度按时间iyfjxgzm1#
对于键/值方法,我会使用复合键来提高一致性:
属性(属性号,标题),pk=属性号
属性\选项(属性\否,选项\否,值),pk=属性\否,选项\否
产品(产品编号,产品名称,…),pk=产品编号
产品属性(产品编号、属性编号、选项编号),pk=产品编号、属性编号
(并且您希望该表的属性\u no+选项\u no上有一个索引。)
这个
product_attributes
主键保证每个产品每个属性只获得一个值。嗯,这对身高、体重等都有好处。如果你想要一个产品有多种颜色等,但是你需要这样的颜色product_attributes
表格包括option_no
在主键中。您可能会得到用于唯一属性和多个属性的单独表。也许以后你甚至想引入具有可选和强制性属性的产品组(冰箱有能量等级,t恤没有)。因此,整个概念可能会增长,但上面的表格应该给你一个如何最好地处理这个问题的想法。查询所有又高又重的红色圆形产品:
或更短的聚合:
rur96b6h2#
所以您需要根据productattribute表中的选项进行选择
在表中存储数据的更好方法是对第四列使用unique/id/主键值,然后您可以
我希望这对你有帮助!
izkcnapc3#
在网上搜索“mysql key-value-table”(感谢@thorsten kettner提供关键字,因为我缺乏术语),我最终得到了如下结果:
基本上,只要在查询中使用一个新属性,一个不同的
INNER JOIN
需要条件。就“性能”而言,一个相当明显的打击将会发生。
根据这个和这个键/值表不应该用于过滤,但在这一点上我没有选择,所以它将由缓存服务器保存一天。
我已经根据我的答案(不需要
GROUP BY
在我的例子中,由于我不使用聚合函数,所以使用键/值对从表中筛选和分组数据9w11ddsr4#
键/值表令人讨厌。所以,如果可以的话,尽量避免。那你就有这些table了:
表格形状
表格颜色
工作台高度
工作台重量
餐桌产品
查询
顺便说一句,你也可以用ID做同样的事情。所以所有的查找表都会得到一个id(round=1,oval=2。。。绿色=1,红色=2,…),产品表将不再包含单词,而是包含ID。查询将是: