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

Posted

技术标签:

【中文标题】Mysql 使用逗号分隔列表 - 连接表【英文标题】:Mysql working with comma separated list - Junction table 【发布时间】:2015-06-19 17:51:02 【问题描述】:

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

表 1

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

这意味着对于 ProductID 2,它具有 Accessory ProductIDs 1,4 和 5 ...

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

表2

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

所以实际上如果使用 UPDATE 它会是这样的

表2

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 用 GRP 字符更改 t2.accessories 中的 productID,以便最终表看起来像这样。

表2

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的表格

【问题讨论】:

【参考方案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 Fiddle

【讨论】:

【参考方案2】:

您需要有第三张表将表 1 与表 2 链接起来。 表二中的附件栏打破了第一范式(Database Normal Form)。永远不应该有一个单元格包含多个数据。这增加了冗余,并且如果不将其拉出并对其进行解析,就无法检索任何单独的附件。

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

所以你会:

表 1

GRP

产品编号

表 2

产品编号

配件

表 3

配件

【讨论】:

以上是关于Mysql 使用逗号分隔列表 - 连接表的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 查询:连接表并将记录显示为单行中的逗号分隔字符串

逗号分隔的连接和MySQL中的语法连接有啥区别? [复制]

如何在 MySQL 的多对多关系中以逗号分隔的列表中的一个字段连接数据?

MySQL:创建逗号分隔列表并在 IN 中使用

mysql中把selct中的数据列表转换成逗号分隔的字符串

php 如何从mysql输出数组用逗号分隔?