【问题标题】:Using a list of ids from a column to create a list of names to save to another使用列中的 id 列表创建名称列表以保存到另一个
【发布时间】:2017-04-20 03:10:59
【问题描述】:

我有一个表,其中有一列包含 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 的特定方言无关紧要,我只是想看看这是否可以在单个更新中完成。

【问题讨论】:

  • 修复你的数据结构。如果您使用虚假的数据表示,那么代码比必要的要困难得多。您应该有一个选择表,每对 id 都有一行。
  • @GordonLinoff 感谢您的建议。有什么更好的方法来表示这样的场景吗?基本上,每个项目都可以有一个父项目,该列表代表链中的每个父项目。

标签: mysql sql


【解决方案1】:

试试这个解决方案(MySQL,对于 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     |
+----------+---------------------+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多