Mysql使用逗号分隔列表 - 连接表

时间:2015-06-19 17:51:02

标签: mysql group-concat junction-table

我有一个带有ProductID和附件列的Junction表:

TABLE1

ProductID    Accessory
1            2
1            3  
2            1
2            4
2            5
3
4            1
5            2

这意味着对于ProductID 2,它具有附件产品ID 1,4和5 ...

我的下面的表2看起来像这样 已经提供了GRP和ProductID,我们需要获取附件。

TABLE2

GRP     ProductID     accessories 
a       2             
b       3             
c       1             
d       4             
e       5 

所以实际上如果使用UPDATE就会像这样

TABLE2

UPDATE table2 t2
set t2.accessories = (SELECT GROUP_CONCAT(DISTINCT t1.Accessory) FROM table1 t1
                      WHERE t1.ProductID = t2.ProductID)

GRP     ProductID     accessories
a       2             1,4,5
b       3              
c       1             2,3
d       4             1
e       5             2

但是我想根据t2.ProductID改变t2.accessories中的产品ID,而不是使用GRP字符,以便FINAL表看起来像这样。

TABLE2

GRP     ProductID     accessories
a       2             c,d,e
b       3              
c       1             a,b
d       4             c
e       5             a

以下是表http://sqlfiddle.com/#!9/83ec9

2 个答案:

答案 0 :(得分:0)

这应该适合你:

UPDATE table2 T
SET T.accessories = IFNULL((SELECT foo FROM
                        (SELECT t1.ProductID,GROUP_CONCAT(t2.GRP) as foo
                            FROM table1 t1 
                            LEFT JOIN table2 t2 ON t1.Accessory = t2.ProductID 
                            GROUP BY t1.ProductID
                        ) AS bar WHERE ProductID = T.ProductID
                     ),'')

以下是更新后的SQL Fiddle

答案 1 :(得分:0)

您需要有第三个表格,将表格1与表格2相关联。 表2中的附件列打破了第一个正常形式(Database Normal Form)。永远不应该有一个包含多个数据的单元格。这会增加冗余,并且无法将其拉出并解析而无法检索任何单个附件。

因此,表1将具有productID和GRP。然后需要一个只有附件的配件桌。表2将具有两者的主键(productID,附件)。为了解决这些问题,你可以自然地加入这三个。这样可以减少冗余,并允许您拥有一个没有任何附件的GRP和产品。

所以你会:

表1

GRP

的productID

表2

的productID

附件

表3

附件