免责声明:我正在使用一个非常奇怪的架构处理遗留数据库。另外,我是一个完整的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实际上是其他表的外键,因此为了清晰起见,这些名称/值不是要包括在内。
选项的数量可以变化(不限于两个),每个选项的值的数量也可以变化。最终,对于给定的产品,数字可能很小,所以我不担心这里的数百万行。
关于我如何做到这一点的任何想法?
谢谢, 第
答案 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