2013-01-06 58 views
0

我嘗試從我的MYSQL數據庫創建一個數據傳送時遇到以下情況。在實際情況中涉及的表格更多,但我希望保持這一簡要並關注手頭的問題。我有兩個表(products_options_values,products_options)和一箇中間表(products_options_values_to_products_options)。 (道歉爲表的格式,但我認爲你可以區分值爲每個字段。)SQL - 將多行分成一行

TABLE: products_options_values<br> 
products_options_values_id | products_options_values_name <br> 
28 9-11<br> 
52 Black<br> 
53 In-Line<br> 

TABLE: products_options_values_to_products_options<br> 
products_options_values_to_products_options_id | products_options_id | products_options_values_id<br> 
    31 2 28<br> 
    56 1 52<br> 
    57 3 53<br> 

TABLE: products_options<br> 
products_options_id | products_options_name <br> 
    1   Color<br> 
    2   Size<br> 
    3   Style<br> 

我想寫結果如下SQL語句:從有關各種表 場product_options_name作爲FIELD名稱和相應的products_options_values_name和相應行中的對應值。例如:

Product_ID Product_Name  MPN Price Color Size Style 
00001 Acme Rollerskates A99 99.99 Black 9-11 In-Line 

有關如何在MYSQL中實現此結果的任何幫助?感謝您的考慮和努力。馬克

+0

這就是你所說的'join'..table結果。 – bonCodigo

+0

產品表在哪裏?你在哪裏存儲'Product_id'和'Product_name'? – Taryn

回答

0

爲了讓你提供的表格成爲這種格式,你基本上是執行一個樞紐但MySQL沒有一個透視功能。所以,你需要使用聚合函數與CASE語句來複制它:

select 
    max(case when po.products_options_name = 'Color' 
     then pov.products_options_values_name else null end) Color, 
    max(case when po.products_options_name = 'Size' 
     then pov.products_options_values_name else null end) Size, 
    max(case when po.products_options_name = 'Style' 
     then pov.products_options_values_name else null end) Style 
from products_options po 
left join products_options_values_to_products_options pv 
    on po.products_options_id = pv.products_options_id 
left join products_options_values pov 
    on pv.products_options_values_id = pov.products_options_values_id 

SQL Fiddle with Demo

結果是:

| COLOR | SIZE | STYLE | 
-------------------------- 
| Black | 9-11 | In-Line | 

看來,你還是需要加入包含產品詳細信息的表格,如product_id,product_name, price

我無法從你提供你的表結構告訴您何處加入這個數據,但查詢將是這樣的:

select p.product_id, 
    p.product_name, 
    p.MPN, 
    p.price, 
    max(case when po.products_options_name = 'Color' 
     then pov.products_options_values_name else null end) Color, 
    max(case when po.products_options_name = 'Size' 
     then pov.products_options_values_name else null end) Size, 
    max(case when po.products_options_name = 'Style' 
     then pov.products_options_values_name else null end) Style 
from products p --- add join to the main products table 
left join products_options po 
    on p.product_id = po.products_options_id 
left join products_options_values_to_products_options pv 
    on po.products_options_id = pv.products_options_id 
left join products_options_values pov 
    on pv.products_options_values_id = pov.products_options_values_id 
group by p.product_id, p.product_name, p.MPN, p.price 
0

我不知道你是否聽說過的Magento的,但是這是類似於他們的EAV設置。基本上,如果您想將行轉換爲列,您必須每次都必須將LEFT連接到字段值表一次。我會在下面做一個簡化的版本。

products table: 
[id, product_name] 
1, product 1 
2, product 2 
3, product 3 

product_fields table: 
[id, product_id, field_name, field_value] 
1, 1, color, red 
2, 2, color, blue 
3, 3, color, black 
4, 1, size, XL 
5, 2, size, XL 
6, 3, size, XL 

SELECT 
    p.product_name, 
    table1.field_value AS color, 
    table2.field_value AS size 
FROM 
    products AS p LEFT JOIN product_fields AS table1 ON 
     p.id = table1.product_id AND 
     table1.field_name='color' 
    LEFT JOIN product_fields AS table2 ON 
     p.id = table2.product_id AND 
     table1.field_name='size' 

通常標識的將被用來代替參加子句中的字段名,但你應該明白了吧。此外,sql server還提供了一個可以滿足你需求的PIVOT功能。我不相信有一個Mysql的等價物,但你可以看看它。

編輯:bluefeet的答案模擬sql server的PIVOT功能。 2005年之前,sql server也是如此。我回答時發佈了他的回答。