2016-01-21 174 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

不可思议,谢谢 –