mysql用逗号分隔的列表工作 - 结表(Mysql working with comma sepa

2019-10-23 10:37发布

我有一个产品ID和附件柱结合表:

表格1

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

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

和我有以下表2中,看起来像这样GRP和产品ID已经被提供,我们需要获取的饰品。

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.accessories的productIDs与GRP字符,而不是根据t2.ProductID使最终的表格看起来是这样的。

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

Answer 1:

这应该为你工作:

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小提琴



Answer 2:

你需要有第三个表与表2中表中的附件列两次破发的第一范式(链接表1 数据库范式 )。 永远不应该有一个以上的部分数据的单元格。 这增加了冗余,使得它不可能获取任何个人附件没有拉出来,并解析它。

因此,表1将产品ID和GRP。 再就是需要与刚刚配件附件表。 表2将具有从两个(的productID,附件)的主键。 为了让他们出去,你会很自然的加入所有三个。 这减少了冗余,可以让你有一个GRP和产品,没有任何配件。

所以,你会:

表格1

GRP

的productID

表2

的productID

附件

表3

附件



文章来源: Mysql working with comma separated list - Junction table