mysql - MYSQL EAV 连接查询优化
问题描述
我正在创建一个电子商务网站,其中包含产品及其变体。所以我决定使用 EAV 进行属性映射,因为我可能有不确定的数据,例如(尺寸、颜色、材料)。但是现在,我正在努力从给定的属性和产品 ID 中找到变体详细信息。
我创建了一个示例数据集...
CREATE TABLE `ec_attributes` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(155) NOT NULL,
`value` varchar(155) NOT NULL,
`status` tinyint(1) NOT NULL DEFAULT '1',
`display_value` varchar(155) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO `ec_attributes` (`id`, `name`, `value`, `status`, `display_value`) VALUES
(1, 'size', 'L', 1, 'Large'),
(2, 'size', 'S', 1, 'Small'),
(3, 'colour', 'RED', 1, 'Red'),
(5, 'size', 'M', 1, 'Medium');
CREATE TABLE `ec_variant_attributes` (
`attribute_id` int NOT NULL,
`variant_id` int NOT NULL,
PRIMARY KEY(`attribute_id`, `variant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO `ec_variant_attributes` (`attribute_id`, `variant_id`) VALUES
(1, 4),
(1, 5),
(3, 4);
CREATE TABLE `ec_product_variant` (
`product_id` int NOT NULL,
`variant_id` int NOT NULL,
`slug` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--
-- Dumping data for table `ec_product_variant`
--
INSERT INTO `ec_product_variant` (`product_id`, `variant_id`, `slug`) VALUES
(1, 1, 'variant_1'),
(1, 4, 'variant_2');
...和 SQLFiddle 相同的http://sqlfiddle.com/#!9/226323/4,并添加了一个获取详细信息的查询(The Created query is so worst)
。
所以我的表结构如下:
ec_product_variant 表
+------------+------------+-----------+
| product_id | variant_id | slug |
+------------+------------+-----------+
| 1 | 1 | variant_1 |
| 1 | 4 | variant_2 |
+------------+------------+-----------+
ec_variant_attribute
+--------------+------------+
| attribute_id | variant_id |
+--------------+------------+
| 1 | 4 |
| 1 | 5 |
| 3 | 4 |
+--------------+------------+
ec_attributes
+----+--------+-------+--------+---------------+
| id | name | value | status | display_value |
+----+--------+-------+--------+---------------+
| 1 | size | L | 1 | Large |
| 2 | size | S | 1 | Small |
| 3 | colour | RED | 1 | Red |
| 5 | size | M | 1 | Medium |
+----+--------+-------+--------+---------------+
我需要的是基于给定请求的 product_variant 表中的变体详细信息:
- product_id = "1"
- 尺寸 = "L"
- 颜色=“红色”
预期的结果是 product_variant 详细信息
| product_id | variant_id | slug |
|------------|------------|-----------|
| 1 | 4 | variant_2 |
我在小提琴中生成了一个查询,我需要更优化的解决方案。谁能帮我?
创建的查询是
select * from ec_product_variant WHERE variant_id = (SELECT size.variant_id FROM ec_variant_attributes size JOIN ec_variant_attributes AS
color ON color.variant_id = size.variant_id AND color.attribute_id = (SELECT id FROM `ec_attributes` WHERE name = 'colour' and value='RED') AND
size.attribute_id = (SELECT id FROM `ec_attributes` WHERE name = 'size' and value='L')
)
解决方案
推荐阅读
- react-native - 在两个不相关的组件之间进行通信
- bash - Grep not parsing the whole file
- cmake - How do I specify the files I want CPack to pack into an RPM?
- javascript - 检查从 iFrame 动态添加的类
- android - 有什么方法可以知道 AUTO VERIFICATION 是否在 firebase 电话身份验证中失败?
- pyomo - 如何从 Coin-OR 框架获取可行性泵的迭代和运行时间
- layout - 如何在“react-admin”“显示”和“编辑”和“创建”屏幕中有更复杂的布局?
- math - Netlogo 获得距离内所有邻居的推力
- highcharts - Does Highchart.js not have 'stacked percentage bar' chart
- javascript - Sequelize ORM:如何将模型静态关联到数据库?