我的产品附件列如下例所示:
TABLE1
ProductID accessories
1 2,3
2 1,4,5
3
4 1
5 2
这意味着对于PRODUCT 2,它有附件产品ID 1,4和5
我在下面的最终表2中看起来像这样
TABLE2
GRP ProductID accessories
a 2
b 3
c 1
d 4
e 5
所以实际上如果使用UPDATE就会像这样
TABLE2
UPDATE table t2
INNER JOIN table1 t1
On t2.ProductID = t1.ProductID
set t2.accessories = t1.accessories
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
我真的很困惑如何正确地做到这一点我能够使用PHP代码处理这个,但它需要很长时间因为我有100k产品因此我更喜欢使用一些group_concat或concat_ws来处理这个
并且可能已经存储了一些t2.accessories,因此它应该是不同的值,因此table2上没有重复的t2.accessories
答案 0 :(得分:1)
您应该修复数据结构以获得联结表。不要将列表存储为字符串。 SQL有一个很好的存储列表的方法;它被称为表。不要将数字存储为字符串。 SQL具有非常好的数字数据类型。他们的名字中不包含“char”。
有一种方法可以在数据库中执行您想要的操作,但您不能抱怨性能。正确构建数据并且速度会更快。
执行连接的选择查询如下所示:
select t1.productid,
group_concat(t2.productid order by find_in_set(t2.ProductId, t1.accessories))
from table1 t1 join
table2 t2
on find_in_set(t2.ProductId, t1.accessories) > 0
group by t1.productid;
但是,你应该真正修复你的数据结构。
答案 1 :(得分:0)
这是我想要的。
UPDATE table2
INNER JOIN (
select t1.productid, group_concat(t2.GRP order by find_in_set(t2.GRP, t1.accessories)) as test from table1 t1
join table2 t2 on find_in_set(t2.ProductId, t1.accessories) > 0 group by t1.productid
) as temp on table2.ProductId=temp.productid
set table2.accessories=temp.test
唯一的问题是,如果您有大量行,则需要花费很长时间