2012-10-18 57 views
3

我花了最近五個小時嘗試從表格中獲得每個產品選項組合,但現在我完全卡住了。我有一個表等(簡化的)數據:如何從MySQL表中獲取所有數據組合?

CREATE TABLE `assigned_options` (
    `option_id` int(10) unsigned NOT NULL DEFAULT '0', 
    `value_id` int(10) unsigned NOT NULL DEFAULT '0', 
); 

INSERT INTO `assigned_options` (`value_id`, `option_id`) VALUES 
(4, 2), 
(3, 2), 
(2, 1), 
(1, 1), 
(5, 3), 
(6, 3), 
(7, 3); 

說選項ID 2與顏色變化紅(4)和藍色(3),選擇id爲1個大小等....

是有可能用一個MySQL查詢來做到這一點?我曾嘗試使用PHP來創建一個循環函數來獲得每一種可能性,但我無法使其工作。

任何提示偉大的讚賞。 :)

+0

工作,你能澄清你是什麼意思「這個」你的聲明「是否有可能做到這一點」?你的查詢除了'CREATE'之外的一個小錯誤是很好的,你可以建立一個很長的'INSERT'查詢來一次添加所有可能的值。我錯過了什麼嗎? – Grzegorz

+2

添加預期結果將有所幫助。 –

+0

你能舉一個你想要做什麼的例子嗎?生成assigned_options記錄,獲取所有可能記錄的列表?你要求的是有點模糊... – Ray

回答

1

鑑於你的表...我假設你想要每一個可能的價值和選擇組合。這是一個交叉連接(沒有任何ON或whe​​re子句限制結果的連接):

SELECT a.value_id, b.option_id 
    FROM assigned_options a 
    JOIN assigned_options b 
    GROUP BY a.value_id, b.option_id 

該組通過篩選出重複結果。

你有2個其他表valueoption你想拉所有的組合嗎?

+0

這不適用於MySQL - 或者至少它是veeeeeeeeery慢 – ChiMo

1
select option_id, value_id 
from assigned_options 
group by option_id, value_id 
order by option_id, value_id 
0

在TSQL中,你可以使用遞歸CTE,不記得我在哪裏得到它,但很漂亮。注意MySQL不使用「與」選項,這樣就不會在MySQL

WITH Numbers(N) AS (
        SELECT N 
        FROM (VALUES(1), (2), (3), (4), (5), (6)) Numbers(N)), 
         Recur(N,Combination) AS (
         SELECT N, CAST(N AS VARCHAR(20)) 
         FROM Numbers 


UNION ALL 

SELECT n.N,CAST(r.Combination + ',' + CAST(n.N AS VARCHAR(10)) AS VARCHAR(20)) 
FROM Recur r 
INNER JOIN Numbers n ON n.N > r.N) 



select Combination 
from RECUR 
ORDER BY LEN(Combination),Combination;