使用另一个表中的相关值更新逗号分隔的ID

时间:2014-07-13 18:02:33

标签: mysql sql

尝试找到一种方法,将table1中列中的所有逗号分隔ID与其他表中的相关值进行更新。注意,表之间没有相关的ROW ID,因为第二个表是引用表。

格式(我没有创建)就像:

项目表1

    id | color_ids
    ---+----------
     1 | 2,5
     2 | 1
     3 | 2,3,9 
etc...

颜色表2

    id | color_name
    ---+-----------
     1 | red
     2 | yellow
     3 | green 
etc...

我最终需要的是更新的表1列(或新列),如:

项目表1

    id | color_ids
    ---+--------------------
     1 | yellow,purple
     2 | red
     3 | yellow,green,orange
etc...

更新:我需要所述格式的原因是数据库将定期更新数据并准备导出,我无法更改传入结构。

2 个答案:

答案 0 :(得分:2)

这是在SQL中实现它的一种方法,但它非常痛苦,因为它会导致相关子查询中的Colors扫描。

UPDATE Items
SET color_ids = (
    SELECT GROUP_CONCAT(Colors.color_name) FROM Colors 
    WHERE FIND_IN_SET(Colors.id, Items.color_ids));

根据表的大小,这可能需要花费很长时间才能运行。

我同意其他评论,这不是在关系数据库中构建数据的正确方法,但我同情你现在仍然坚持使用设计,我认为它会更加中断在你的应用程序中重新设计它。

我希望这段经历可以帮助您成为一名不会因类似设计而诅咒您的继任者的开发人员!

答案 1 :(得分:1)

从不,永远,永远不要在一列中存储多个值!你应该引入一个新表:

item_colors
------------
item_id
color_id

示例数据:

item_id |  color_id
      1 |  2
      1 |  5
      2 |  1
      3 |  2
      3 |  3
      3 |  9

您的items表格不再有color_ids列。

然后你可以得到你想要的结果

select i.id, group_concat(c.name) as color_names
from items i
left join item_colors ic on ic.item_id = i.id
join colors c on ic.color_id = c.id
group by i.id