2017-10-11 25 views
2

我試圖進入這一問題儘可能明確合併兩個領域進入第一場,其中的product_id是相同的,attribute_id是53或54

在MySQL中我有一個表oc_product_attribute

我有表看起來像這樣

------------------------------- 
|product_id|attribute_id|text | 
------------------------------- 
|2125  |53   |text1| 
|2125  |54   |text2| 
|2356  |53   |text3| 
|2356  |54   |text4| 
------------------------------- 

我想擺脫attribute_id 54和在這一領域的文本用逗號作爲分隔符追加到文本attribute_id 53。

所以basicly看起來像這樣:

-------------------------------------- 
|product_id|attribute_id|text  | 
-------------------------------------- 
|2125  |53   |text1, text2| 
|2356  |53   |text3, text4| 
-------------------------------------- 

我也有其他的attribute_is的,我不希望改變。

任何人都知道如何?

+0

你想展示你做了什麼至今... – SubjectDelta

+1

https://dev.mysql.com/doc/refman/5.7/en/group- by-functions.html#function_group-concat – SubjectDelta

+0

使用case語句將54更改爲53'case when attribute_ID = 54 then 53 else attribute_ID end as Attribute_ID'然後使用'group_concat()'將文本與一個group在product_ID和attribute_ID上。但是您沒有指定是否希望將其作爲表更改或查詢。另外,如果表格變化,我認爲你會走錯路。因爲您現在在單個字段中具有多個值,這在數據庫設計中是不允許的。 – xQbert

回答

1

使用GROUP BY與MIN組合,GROUP_CONCAT

SELECT 
    product_id 
    , MIN(attribute_id) AS attribute_id 
    , GROUP_CONCAT(text) AS text 
FROM 
[table] 
WHERE 
attribute_id IN(53, 54) 
GROUP BY 
product_id 
ORDER BY 
product_id ASC 
+0

這給了我一個正確的輸出。如何更新文本字段。這可能嗎? –

+0

@Gerjan Krul不會提醒更新規範化的數據,並使其非規範化..除了你需要有兩個查詢更新和刪除查詢。 –

0
  1. 要結合53和54,你需要,因爲你必須要堅持其他值使用case語句。
  2. 然後,您可以使用GROUP_CONCAT()的值組合成一個字段

SELECT product_Id 
    , CASE WHEN attribute_id = 54 THEN 53 ELSE attribute_id END as attribute_Id 
    , group_concat(text SEPARATOR ',') as text 
FROM TABLE 
GROUP BY product_Id 
     , CASE WHEN attribute_id = 54 THEN 53 ELSE attribute_id END 
+0

對不起。我不是開發者。但沒有任何事情發生。 不應該使用更新命令嗎?看起來我只是在選擇。 –

+1

對你原來的帖子發表評論說:「你沒有指定你是否想要這個表作爲表或查詢。此外,如果表更改,我認爲你會錯誤的方式;因爲你現在有多個值在一個單一領域是數據庫設計中的一個難題。「 – xQbert

+0

我明白你對多個值的看法,但問題是在導入過程中出現問題。 54中的值應該屬於53屬性。 更準確地說,它是關於服裝的屬性53描述材料及其每平方米的重量。意外地,每平方米的重量是以54屬性導入的。 –

0

GROUP_CONCAT是你所需要的。

SELECT `product_id`, `attribute_id`, GROUP_CONCAT(`text`) AS "text" 
FROM `oc_product_attribute` 
GROUP BY `product_id` 
ORDER BY `product_id`, `attribute_id` 

排序attribute_id會讓你走總是第一個值

UPDATE

看來這個問題是更加具體,那麼我吼聲,這是我認爲你'請求... 當然,你通過其他答案中的評論收到的建議是相當不錯的,你應該考慮他們...

UPDATE `oc_product_attribute` as prod53 
INNER JOIN `oc_product_attribute` as prod54 
ON `prod53`.`product_id` = `prod54`.`product_id` 
AND `prod53`.`attribute_id` = 53 
AND `prod54`.`attribute_id` = 54 
SET `prod53`.`text` = CONCAT(`prod53`.`text`, ", ", `prod54`.`text`); 

DELETE `prod54`.* 
FROM `oc_product_attribute` as prod53 
INNER JOIN `oc_product_attribute` as prod54 
ON `prod53`.`product_id` = `prod54`.`product_id` 
AND `prod53`.`attribute_id` = 53 
AND `prod54`.`attribute_id` = 54; 

警告測試他們執行前,使用事務沒有提交,或試圖SELECT,而不是編輯它們......如果查詢顯示你所期望的,那麼PROCEDE。

0

您需要使用group_concat()

select product_id, 
attribute_id, 
group_concat(text) as text 
from oc_product_attribute 
group by product_id; 
相關問題