2010-11-06 40 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