mysql eav连接查询优化

cnh2zyt3  于 2021-07-29  发布在  Java
关注(0)|答案(0)|浏览(322)

我正在创建一个电子商务网站,其中包括产品及其变种。所以我决定使用eav进行属性Map,因为我可能有不确定的数据,比如(大小、颜色、材质)。但现在,我正努力从给定的属性和产品id中找到变体细节。
我创建了一个样本数据集。。。

  1. CREATE TABLE `ec_attributes` (
  2. `id` int NOT NULL AUTO_INCREMENT,
  3. `name` varchar(155) NOT NULL,
  4. `value` varchar(155) NOT NULL,
  5. `status` tinyint(1) NOT NULL DEFAULT '1',
  6. `display_value` varchar(155) NOT NULL,
  7. PRIMARY KEY (`id`)
  8. ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
  9. INSERT INTO `ec_attributes` (`id`, `name`, `value`, `status`, `display_value`) VALUES
  10. (1, 'size', 'L', 1, 'Large'),
  11. (2, 'size', 'S', 1, 'Small'),
  12. (3, 'colour', 'RED', 1, 'Red'),
  13. (5, 'size', 'M', 1, 'Medium');
  14. CREATE TABLE `ec_variant_attributes` (
  15. `attribute_id` int NOT NULL,
  16. `variant_id` int NOT NULL,
  17. PRIMARY KEY(`attribute_id`, `variant_id`)
  18. ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
  19. INSERT INTO `ec_variant_attributes` (`attribute_id`, `variant_id`) VALUES
  20. (1, 4),
  21. (1, 5),
  22. (3, 4);
  23. CREATE TABLE `ec_product_variant` (
  24. `product_id` int NOT NULL,
  25. `variant_id` int NOT NULL,
  26. `slug` varchar(255) NOT NULL
  27. ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
  28. --
  29. -- Dumping data for table `ec_product_variant`
  30. --
  31. INSERT INTO `ec_product_variant` (`product_id`, `variant_id`, `slug`) VALUES
  32. (1, 1, 'variant_1'),
  33. (1, 4, 'variant_2');

... 和sqlfiddle一样http://sqlfiddle.com/#!9/226323/4,并添加了一个获取详细信息的查询 (The Created query is so worst) .
所以我的表结构如下:
ec\产品\变型表

  1. +------------+------------+-----------+
  2. | product_id | variant_id | slug |
  3. +------------+------------+-----------+
  4. | 1 | 1 | variant_1 |
  5. | 1 | 4 | variant_2 |
  6. +------------+------------+-----------+

ec\变量\属性

  1. +--------------+------------+
  2. | attribute_id | variant_id |
  3. +--------------+------------+
  4. | 1 | 4 |
  5. | 1 | 5 |
  6. | 3 | 4 |
  7. +--------------+------------+

电子商务属性

  1. +----+--------+-------+--------+---------------+
  2. | id | name | value | status | display_value |
  3. +----+--------+-------+--------+---------------+
  4. | 1 | size | L | 1 | Large |
  5. | 2 | size | S | 1 | Small |
  6. | 3 | colour | RED | 1 | Red |
  7. | 5 | size | M | 1 | Medium |
  8. +----+--------+-------+--------+---------------+

我需要的是基于给定请求的产品变量表中的变量详细信息:
产品id=“1”
size=“l”
colour=“红色”
预期结果是产品变量详细信息

  1. | product_id | variant_id | slug |
  2. |------------|------------|-----------|
  3. | 1 | 4 | variant_2 |

我有一个在小提琴生成的查询,我需要更优化的解决方案。有人能帮我吗?
创建的查询是

  1. select * from ec_product_variant WHERE variant_id = (SELECT size.variant_id FROM ec_variant_attributes size JOIN ec_variant_attributes AS
  2. color ON color.variant_id = size.variant_id AND color.attribute_id = (SELECT id FROM `ec_attributes` WHERE name = 'colour' and value='RED') AND
  3. size.attribute_id = (SELECT id FROM `ec_attributes` WHERE name = 'size' and value='L')
  4. )

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题