2016-03-31 77 views
1
select pd.products_name, 
GROUP_CONCAT(pag.customers_group_id SEPARATOR ',') group_id, 
pa.`options_values_price` Retail, 
GROUP_CONCAT(pag.options_values_price SEPARATOR ',') volume_and_designer 


from products_attributes pa 

left join products_description pd 
on pa.products_id = pd.products_id and pd.language_id = '1' 

left join products_attributes_groups pag 
on pa.`products_attributes_id`= pag.`products_attributes_id` 

where pa.products_id='225' 

GROUP BY `pa`.`products_attributes_id` 

ORDER BY `pa`.`products_attributes_id` ASC 

上面的查詢返回我這樣MySql的分裂別名爲多列

| products_name | group_id | Retail | volume_and_sdesign | 
------------------------------------------------------------- 
| GOLD   | 1,2 | 15  |  30,35   | 
| SILVER  | 2,1 | 16  |  40,45   | 
| BRONZE  | 1,2 | 17  |  50,55   | 

我想達到的輸出在表中添加,因此最後一列以上2多個別名(volume_and_sdesign)根據group_id列分成兩列(即volume,SDesign)。 1對應於音量,2對應於SDesign。

Gold has group_id (1,2) 
so its volume_and_sdesign (30,35) will make new columns 
volume = 30 
SDesign = 35 

Silver has group_id (2,1) 
so its volume_and_sdesign (40,45) will make new columns 
volume = 45 
SDesign = 40 

Bronze has group_id (1,2) 
so its volume_and_sdesign (50,55) will make new columns 
volume = 50 
SDesign = 55 

因此,上表看起來就像這樣

| products_name | group_id | Retail | volume_and_sdesign | volume | SDesign| 
------------------------------------------------------------- 
| GOLD   | 1,2 | 15  |  30,35   |30  | 35  | 
| SILVER  | 2,1 | 16  |  40,45   |45  | 40  | 
| BRONZE  | 1,2 | 17  |  50,55   |50  | 55  | 

任何幫助將非常感激

回答

0

可以使用條件聚合 - 這是case內聚合功能如max()

select pd.products_name, 
     group_concat(pag.customers_group_id SEPARATOR ',') as group_id, 
     pa.`options_values_price` as Retail, 
     group_concat(pag.options_values_price SEPARATOR ',') as volume_and_designer, 
     max(case when group_id = 1 then pag.options_values_price end) as volume, 
     max(case when group_id = 2 then pag.options_values_price end) as SDesign 
from products_attributes pa left join 
    products_description pd 
    on pa.products_id = pd.products_id and pd.language_id = '1' left join 
    products_attributes_groups pag 
    on pa.`products_attributes_id` = pag.`products_attributes_id` 
where pa.products_id='225' 
group by `pa`.`products_attributes_id` 
order by `pa`.`products_attributes_id` ASC 
+0

就像一個魅力!謝謝 –

0

這可以使用LEFT,RIGHTSUBSTRING_INDEX來實現。

試試這個:

select 
    pd.products_name, 
    GROUP_CONCAT(pag.customers_group_id SEPARATOR ',') group_id, 
    pa.`options_values_price` Retail, 
    GROUP_CONCAT(pag.options_values_price SEPARATOR ',') volume_and_designer, 
    IF(LEFT(group_id,1) = 1, SUBSTRING_INDEX(volume_and_designer, ',', 1), SUBSTRING_INDEX(volume_and_designer, ',', -1)) as volume, 
    IF(RIGHT(group_id,1) = 1, SUBSTRING_INDEX(volume_and_designer, ',', 1), SUBSTRING_INDEX(volume_and_designer, ',', -1)) as SDesign 
from products_attributes pa 
left join products_description pd 
on pa.products_id = pd.products_id and pd.language_id = '1' 
left join products_attributes_groups pag 
on pa.`products_attributes_id`= pag.`products_attributes_id` 
where pa.products_id='225' 
GROUP BY `pa`.`products_attributes_id` 
ORDER BY `pa`.`products_attributes_id` ASC