Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql获取以逗号分隔的列列表_Mysql_Sql_Group Concat_Concat Ws - Fatal编程技术网

Mysql获取以逗号分隔的列列表

Mysql获取以逗号分隔的列列表,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

我有一个关于产品附件的专栏,如下例:

表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
有一行。