2016-01-21 139 views
1

我目前有兩個表,它們沒有連接。mySQL,查找和替換,在一個表中查找並替換爲另一個

tbl_prod 
cat_ids  prod_txt 
1,2,3   some text 

tbl_cat 
category_id cat_name 
1    A 
2    M 
3    P 

我需要執行一個查詢,將更新「cat_ids」一欄的內容,這樣的內容是這樣的:

tbl_prod 
    cat_ids  prod_txt 
    A,M,P   some text 

這甚至在MySQL的可能,否則我可能會更好關閉創建一個腳本來做到這一點。由於

+3

規範化,標準化和一次正常化 – lad2025

+0

這些基本上是臨時表,數據已經從什麼地方來,我不要沒有控制輸出,所以標準化在這裏不是一個真正的選擇。 –

+0

@Liam。 。 。在加載數據時,您可以將數據標準化爲第一步,然後根本不處理逗號分隔列表,以永久存儲數據。 –

回答

1

正確方法:

正常化你的表。將外鍵存儲爲csv列是非常糟糕的主意。

解決方法:

我沒有對輸出的控制,所以標準化是不是真的一個不錯的選擇

SELECT GROUP_CONCAT(tc.cat_name ORDER BY tc.category_id) AS cat_ids, 
     MAX(prod_txt) AS prod_txt 
FROM tbl_prod AS tp 
JOIN tbl_cat AS tc 
    ON FIND_IN_SET(tc.category_id, tp.cat_ids) > 0 
GROUP BY cat_ids; 

SqlFiddleDemo

輸出:

╔══════════╦═══════════╗ 
║ cat_ids ║ prod_txt ║ 
╠══════════╬═══════════╣ 
║ A,M,P ║ some text ║ 
╚══════════╩═══════════╝ 

更新:

UPDATE tbl_prod t 
join (SELECT GROUP_CONCAT(tc.cat_name ORDER BY tc.category_id) AS cat_ids_rep, 
      MAX(tp.cat_ids) AS cat_ids 
    FROM tbl_prod AS tp 
    JOIN tbl_cat AS tc 
     ON FIND_IN_SET(tc.category_id, tp.cat_ids) > 0 
     GROUP BY cat_ids 
    ) AS sub 
ON t.cat_ids = sub.cat_ids 
SET t.cat_ids = sub.cat_ids_rep; 

SqlFiddleDemo2

+1

不可思議,謝謝 –