首页 > 解决方案 > 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_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')
)

标签: mysqlsqlquery-optimizatione-commerceentity-attribute-value

解决方案


推荐阅读