Mysql 使用逗号分隔列表 - 连接点 table
Mysql working with comma separated list - Junction table
我有一个 Junction table 与 ProductID 和 Accessory 列:
TABLE1
ProductID Accessory
1 2
1 3
2 1
2 4
2 5
3
4 1
5 2
这意味着对于 ProductID 2,它具有 Accessory ProductIDs 1,4 和 5 ...
我有下面的 TABLE 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 使用 GRP 字符更改 t2.accessories 中的产品 ID,以便最终 table 看起来像这样。
TABLE2
GRP ProductID accessories
a 2 c,d,e
b 3
c 1 a,b
d 4 c
e 5 a
这里是 tables http://sqlfiddle.com/#!9/83ec9
这应该适合你:
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
您需要第三个 table 链接 table 1 和 table 2。
table 两个中的附件列打破了第一范式 (Database Normal Form)。永远不应有一个单元格包含多个数据。这增加了冗余,并且如果不将其拉出并进行解析就无法检索任何单个附件。
因此,table 1 将具有 productID 和 GRP。然后需要有一个附件table,只有附件。 Table 2 将具有来自两者的主键(productID,accessory)。为了让他们出去,你会很自然地加入这三个。这减少了冗余并允许您拥有没有任何附件的 GRP 和产品。
所以你会:
Table 1
总收视点
产品编号
Table 2
产品编号
配件
Table 3
配件
我有一个 Junction table 与 ProductID 和 Accessory 列:
TABLE1
ProductID Accessory
1 2
1 3
2 1
2 4
2 5
3
4 1
5 2
这意味着对于 ProductID 2,它具有 Accessory ProductIDs 1,4 和 5 ...
我有下面的 TABLE 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 使用 GRP 字符更改 t2.accessories 中的产品 ID,以便最终 table 看起来像这样。
TABLE2
GRP ProductID accessories
a 2 c,d,e
b 3
c 1 a,b
d 4 c
e 5 a
这里是 tables http://sqlfiddle.com/#!9/83ec9
这应该适合你:
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
您需要第三个 table 链接 table 1 和 table 2。 table 两个中的附件列打破了第一范式 (Database Normal Form)。永远不应有一个单元格包含多个数据。这增加了冗余,并且如果不将其拉出并进行解析就无法检索任何单个附件。
因此,table 1 将具有 productID 和 GRP。然后需要有一个附件table,只有附件。 Table 2 将具有来自两者的主键(productID,accessory)。为了让他们出去,你会很自然地加入这三个。这减少了冗余并允许您拥有没有任何附件的 GRP 和产品。
所以你会:
Table 1
总收视点
产品编号
Table 2
产品编号
配件
Table 3
配件