如何在MySQL中获取单个表的笛卡尔积

时间:2010-11-06 13:17:15

标签: sql mysql

免责声明:我正在使用一个非常奇怪的架构处理遗留数据库。另外,我是一个完整的SQL菜鸟,所以这也没有帮助。

基本上,我有一个包含产品变化的表格。一个很好的例子可能是T恤。 “通用”T恤有产品编号。每种类型的变体(大小,颜色)都有一个id。变体的每个值(红色,小)都有一个id。

所以表格如下:

 +----+----------+-----------+-------------+----------+------------+
 | id | tshirt   | option_id | option_name | value_id | value_name |
 +----+----------+-----------+-------------+----------+------------+
 | 1  | Zombies! | 2         | color       | 13       | red        |
 | 1  | Zombies! | 2         | color       | 24       | black      |
 | 1  | Zombies! | 3         | size        | 35       | small      |
 | 1  | Zombies! | 3         | size        | 36       | medium     |
 | 1  | Zombies! | 3         | size        | 56       | large      |
 | 2  | Ninja!   | 2         | color       | 24       | black      |
 | 2  | Ninja!   | 3         | size        | 35       | small      |
 +----+----------+-----------+-------------+----------+------------+

我想编写一个查询来检索给定产品的不同组合。

在这个例子中,Zombie衬衫有红/小,红/中,红/大,黑/小,黑/中,黑/大(六种)。 Ninja衬衫只有一个变化:黑色/小号。

我相信这是尺寸和颜色的笛卡尔积。

这些ID实际上是其他表的外键,因此为了清晰起见,这些名称/值不是要包括在内。

选项的数量可以变化(不限于两个),每个选项的值的数量也可以变化。最终,对于给定的产品,数字可能很小,所以我不担心这里的数百万行。

关于我如何做到这一点的任何想法?

谢谢, 第

2 个答案:

答案 0 :(得分:2)

试试这个:

select 
 f.id,
 f.tshirt,
 color.option_id as color_option_id,
 color.option_name as color_option_name,
 color.value_id as color_value_id,
 color.value_name as color_value_name,
 size.option_id as size_option_id,
 size.option_name as size_option_name,
 size.value_id as size_value_id,
 size.value_name as size_value_name
from 
 foo f
inner join foo color on f.id = color.id and f.value_id = color.value_id and color.option_id = 2 
inner join foo size on f.id = size.id and size.option_id = 3
order by 
 f.id, 
 color.option_id, color.value_id, 
 size.value_id, size.value_id;

答案 1 :(得分:0)

看起来distinct可以解决这个问题:

select  distinct tshirt
,       option_name
,       value_name
from    YourTable