2013-01-23 40 views
2

我有2個表:SQL表排序denomalized表

「產品」 conatains基本產品數據

product_id | product_name | product_picture 
1   | test   | pic.jpg 
2   | samp   | sam.gif 

product_details包含細節,爲產品(每PRODUCT_ID 1個或多個)

product_id | unit | value 
1   | size | 100mm 
1   | weight | 100g 
2   | size | 80mm 
2   | color | red 

現在我想按大小對它進行排序。 (有點像正規表)結果:

2 | sample | sam.gif | size | 80mm | color | red 
1 | test | pic.jpg | size | 100mm | weight | 100g 

編程語言是PHP。 Usualy我會這樣做(PSEUDOCODE):

while (SELECT * FROM a) { 
    while(SELECT * FROM b WHERE id = a.id) { 
     myarray[a.id][b.unit] = b.value; 
    } 
} 

但我不知道如何排序結果。 (我想用PHP排序比SQL少高性能?)

編輯: 的新思路:首先做一個查詢來選擇正確的順序product_ids:

while(SELECT products_id FROM products INNER JOIN products_details USING(products_id) WHERE unit = 'size' ORDER BY value) { 
    while(SELECT value, unit FROM products_details WHERE products_id = id) { 
     myarray[a.id][b.unit] = b.value; 
    } 
} 

回答

2

如果你想它標準化,你應在不同列中具有不同類型的屬性。基本上,你需要unpivot你的屬性。一種方法是使用條件的聚集,像這樣:

SELECT 
    p.product_id, 
    p.product_name, 
    p.product_picture, 
    MAX(CASE d.unit WHEN 'size' THEN d.value END) AS size, 
    MAX(CASE d.unit WHEN 'weight' THEN d.value END) AS weight, 
    MAX(CASE d.unit WHEN 'color' THEN d.value END) AS color 
FROM products p 
LEFT JOIN product_details d 
ON p.product_id = d.product_id 
GROUP BY 
    p.product_id, 
    p.product_name, 
    p.product_picture 
; 

這會給你這樣的數據集:

product_id product_name product_picture size weight color 
---------- ------------ --------------- ----- ------ ----- 
1   test   pic.jpg   100mm 100g NULL 
2   samp   sam.gif   80mm NULL red 

一旦你分配給每個屬性一個單獨的列,您可以排序任何你喜歡的行。例如:

SELECT 
    p.product_id, 
    p.product_name, 
    p.product_picture, 
    MAX(CASE d.unit WHEN 'size' THEN d.value END) AS size, 
    MAX(CASE d.unit WHEN 'weight' THEN d.value END) AS weight, 
    MAX(CASE d.unit WHEN 'color' THEN d.value END) AS color 
FROM products p 
LEFT JOIN product_details d 
ON p.product_id = d.product_id 
GROUP BY 
    p.product_id, 
    p.product_name, 
    p.product_picture 
ORDER BY weight, color, size 
; 
+0

這是一個非常好的解決方案。謝謝!我會嘗試。 – waflija