使用列中的id列表创建要保存到另一个列表的名称列表

时间:2017-04-19 17:52:02

标签: mysql sql

我的表有一个包含id列表的列: 1234,2345,3456

这些ID中的每一个都是同一个表中其中一行的主键。

每一行都有一个名称字段。如何将ID列表更改为名称列表?

ID,   NAME,  IDLIST    
----------------------    
1234, name1, (null)    
2345, name2, 1234,2345    
3456, name3, 1234,3456

为每列使用上面的idList将创建一个新列表:

nameList for 2345 = name1,name2

nameList for 3456 = name1,name3

SQL的特定方言并不重要,我只是试图找出是否可以在单个更新中完成。

1 个答案:

答案 0 :(得分:1)

尝试此解决方案(MySQL,for Oracle将GROUP_CONCAT更改为WMSYS.WM_CONCAT)

的制备:将

create table tmp_table(
    id int,
    name varchar(5),
    idslist varchar(20)
);

insert into tmp_table(id, name, idslist) values(
    1234,
    'name1',
    null
);
insert into tmp_table(id, name, idslist) values(
    2345,
    'name2',
    '1234,2345'
);
insert into tmp_table(id, name, idslist) values(
    3456,
    'name3',
    '1234,3456'
);

查询:

select 
    t1.id, t1.name, t1.idslist, GROUP_CONCAT(distinct t2.name) 
from 
    tmp_table t1 
    LEFT JOIN tmp_table t2 ON t1.idslist like CONCAT('%', t2.id, '%') 

GROUP BY t1.id, t1.name, t1.idslist
;

结果:

1234    name1       
2345    name2   1234,2345   name1,name2
3456    name3   1234,3456   name3,name1

它有效,但如果你有id,比如12和1234,可能会引起麻烦。

我建议您使用多对多关系表。如果您需要订单,可以添加订单字段,它将类似于

+----------+---------------------+
| child_id | parent_id | position|
+----------+---------------------+
| 2345     | 1234      |   1     |
| 2345     | 2345      |   2     |
+----------+---------------------+