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

Mysql使用逗号分隔列表-连接表,mysql,group-concat,junction-table,Mysql,Group Concat,Junction Table,我有一个带有ProductID和附件列的连接表: 表1 ProductID Accessory 1 2 1 3 2 1 2 4 2 5 3 4 1 5 2 这意味着对于ProductID 2,它具有辅助ProductID 1、4和5 下面的表2是这样的 GRP和ProductID已经提供,我们需要获取附件 表2 GRP Pr

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

表1

ProductID    Accessory
1            2
1            3  
2            1
2            4
2            5
3
4            1
5            2
这意味着对于ProductID 2,它具有辅助ProductID 1、4和5

下面的表2是这样的 GRP和ProductID已经提供,我们需要获取附件

表2

GRP     ProductID     accessories 
a       2             
b       3             
c       1             
d       4             
e       5 
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
GRP     ProductID     accessories
a       2             c,d,e
b       3              
c       1             a,b
d       4             c
e       5             a
所以实际上,如果使用UPDATE,它会是这样的

表2

GRP     ProductID     accessories 
a       2             
b       3             
c       1             
d       4             
e       5 
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
GRP     ProductID     accessories
a       2             c,d,e
b       3              
c       1             a,b
d       4             c
e       5             a
但是我想根据t2.ProductID,用GRP字符来更改t2.accessories中的ProductID,以便最终的表如下所示

表2

GRP     ProductID     accessories 
a       2             
b       3             
c       1             
d       4             
e       5 
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
GRP     ProductID     accessories
a       2             c,d,e
b       3              
c       1             a,b
d       4             c
e       5             a

以下是表格

这应该适合您:

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
                     ),'')

以下是更新的

这应该适合您:

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
                     ),'')

这是更新后的

您需要第三个表来链接表1和表2。 表2中的附件列打破了第一个范式()。决不能有一个单元格包含多条数据。这增加了冗余度,使得在不拉出并解析任何附件的情况下,无法检索任何单个附件

因此,表1将包含productID和GRP。然后需要一个只有附件的附件表。表2将具有来自这两者的主键(productID、附件)。为了把他们弄出来,你会自然而然地加入这三个人。这减少了冗余,并允许您拥有一个没有任何附件的GRP和产品

所以你会:

表1 玻璃钢

产品ID

表2 产品ID

附属品

表3
附件

您需要第三个表来链接表1和表2。 表2中的附件列打破了第一个范式()。决不能有一个单元格包含多条数据。这增加了冗余度,使得在不拉出并解析任何附件的情况下,无法检索任何单个附件

因此,表1将包含productID和GRP。然后需要一个只有附件的附件表。表2将具有来自这两者的主键(productID、附件)。为了把他们弄出来,你会自然而然地加入这三个人。这减少了冗余,并允许您拥有一个没有任何附件的GRP和产品

所以你会:

表1 玻璃钢

产品ID

表2 产品ID

附属品

表3 附属品