2010-11-06 83 views
0

免责声明:我正在处理遗留数据库,这个数据库具有非常奇怪的模式。另外,我是一个完整的SQL noob,所以这也没有帮助。如何在单个表中获取MySQL中的笛卡尔积

基本上,我有一个表有产品变化。一个很好的例子可能是T恤。 “通用”T恤有一个产品ID。每种类型的变体(大小,颜色)都有一个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  | 
+----+----------+-----------+-------------+----------+------------+ 

我想写获取给定产品的不同组合查询。在这个例子中,僵尸衬衫有红/小,红/中,红/大,黑/小,黑/中,黑/大(六种不同)。忍者衬衫只有一个变化:黑/小。

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

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

选项数量可能会有所不同(不限于两个),每个选项的值数量也可能会有所不同。最终,这些数字可能对于特定产品来说很小,所以我并不担心这里有数百万行。

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

谢谢, p。

回答

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; 
+0

这样做的技巧,虽然它似乎只处理两个变量(在这种情况下大小/颜色)。尽管现在我需要弄清楚如何查找这些外键而不会泄露结果。谢谢! – philoye 2010-11-07 11:59:29

0

貌似distinct可以做的伎俩:

select distinct tshirt 
,  option_name 
,  value_name 
from YourTable 
+0

这只会取回两行(忍者和僵尸),当我需要在给定的例子七人。 – philoye 2010-11-07 12:01:37