Mysql获取以逗号分隔的列列表
我有一个关于产品附件的专栏,如下例: 表1Mysql获取以逗号分隔的列列表,mysql,sql,group-concat,concat-ws,Mysql,Sql,Group Concat,Concat Ws,我有一个关于产品附件的专栏,如下例: 表1 ProductID accessories 1 2,3 2 1,4,5 3 4 1 5 2 这意味着对于产品2,其附件产品ID为1、4和5 最后的表2如下所示 表2 GRP ProductID accessories a 2 b 3 c 1
ProductID accessories
1 2,3
2 1,4,5
3
4 1
5 2
这意味着对于产品2,其附件产品ID为1、4和5
最后的表2如下所示
表2
GRP ProductID accessories
a 2
b 3
c 1
d 4
e 5
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
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 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
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 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
GRP ProductID accessories
a 2 c,d,e
b 3
c 1 a,b
d 4 c
e 5 a
我真的很困惑如何正确地做到这一点,我能够使用php代码处理这个问题,但这需要很长时间,因为我有10万个产品,因此我更喜欢使用一些group_concat或concat_ws来处理这个问题
一些t2.accessories可能已经存储,因此它应该是不同的值,因此表2中没有重复的t2.accessories
以下是表您应该修复数据结构以拥有连接表。不要将列表存储为字符串。SQL有一个非常好的存储列表的方法;它叫桌子。不要将数字存储为字符串。SQL具有非常好的数字数据类型。它们的名称中不包含“char” 有一种方法可以在数据库中执行您想要的操作,但您不能抱怨性能。正确地组织数据,它会运行得更快 执行连接的select查询如下所示:
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;
但是,您真的应该修复数据结构。这正是我想要的
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
唯一的问题是,如果您有大量的行,这将需要很长的时间这将非常困难,因为您必须解析附件字符串以获得每个整数值。如果你可以改变你的数据库模式,你应该尽量不要存储逗号分隔的列表。事实上,我已经有200万行带有逗号分隔的附件。所以,如果有可能处理,那就太好了,希望有人知道如何处理,但在将来,尽量不要这样做。这是一个非常好的问题。更改数据库的结构。您应该使用多对多关系。因此建议将逗号分隔字符串的值拆分到另一个表中?多亏了这一点,它几乎是正确的,这对我很有用
从表1 t1选择t1.productid,group_concat(t2.GRP order by find_in_set(t2.GRP,t1.accessories))从表1 t1连接表2 t2 on find_in_in_set(t2.ProductId,t1.accessories)>0 group by t1.ProductId只需将其更改为更新,如更新表2 t2 set t2.accessories=(选择..我提供的表结构只是虚拟数据。我使用的表结构正确。如果您有以逗号分隔的标识符列表存储为字符串,那么您的数据结构如何正确?如果您有不同的数据结构,您应该问一个新问题。我想您指的是另一种结构。据我所知。在本文中大小写。逗号分隔的附件列应为整数?如果附件列包含字符,则最好将它们逐个存储在单独的表中?@inventor…最好将它们存储在单独的表中,称为连接表,每个
ProductId
和association
有一行。