n个属性与mysql中的值之间的笛卡尔积(笛卡尔积)

时间:2018-04-30 17:30:03

标签: mysql

编辑: 我的意思是动态是如果我添加另一个属性,如存储,我不想更改查询。存储可以有32gb或64gb,然后创建总共18种组合。现在我必须添加另一个连接和更多列来选择。我希望能够只更改属性ID列表,它将创建一个逗号分隔的属性名称和ID列表。

我有2个属性颜色和大小。每个属性都有一个或多个值。

示例:

Color: red, yellow, blue

Size: small, medium, large

我需要创建一个查询,根据任意数量的属性创建所有可能组合的列表。

在这种情况下,它将是:

Red    small    
red    medium    
red    large    
yellow small    
yellow medium    
yellow large

我想出了一种方法来为2个属性做这件事,但我需要它更具动态性

架构:

CREATE TABLE `phppos_attribute_values` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `ecommerce_attribute_term_id` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `attribute_id` int(10) NOT NULL,
  `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `deleted` int(1) NOT NULL DEFAULT '0',
  `last_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name_attribute_id` (`name`,`attribute_id`),
  KEY `phppos_attribute_values_ibfk_1` (`attribute_id`),
  CONSTRAINT `phppos_attribute_values_ibfk_1` FOREIGN KEY (`attribute_id`) REFERENCES `phppos_attributes` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |

查询:

SELECT a1.name,a1.id,a2.name,a2.id 
FROM phppos_attribute_values a1 
JOIN phppos_attribute_values as a2 ON a2.attribute_id = 2 
WHERE a1.attribute_id = 1

结果:

+--------+----+--------+----+
| name   | id | name   | id |
+--------+----+--------+----+
| red    |  1 | small  |  7 |
| red    |  1 | medium |  8 |
| red    |  1 | large  |  9 |
| yellow |  2 | small  |  7 |
| yellow |  2 | medium |  8 |
| yellow |  2 | large  |  9 |
| blue   |  3 | small  |  7 |
| blue   |  3 | medium |  8 |
| blue   |  3 | large  |  9 |
+--------+----+--------+----+

最后我只需要所有组合的ID。

上面的查询有效,但它是静态的;我希望能够动态获取属性ID,而不是每次添加属性时都必须更改查询。

0 个答案:

没有答案