将逗号分隔的字符串分隔为新表

时间:2017-05-31 18:59:18

标签: mysql phpmyadmin

我继承了一个项目,该项目在名为“ com_barchan_project ”的表中存储了名为“子部门”的字段中的逗号分隔字符串。我需要改变这种可怕的设计,因为它被证明是一个试图解析这个领域的问题。有关完整故事,请参阅HERE

| id | name | sector | subsector |
+----+------+--------+-----------+
|  1 | test |   2    |  3,4,7    |
+----+------+--------+-----------+
|  2 | door |   5    |  2        |

我创建了一个名为“ com_barchan_project_subsector_join ”的新表格,其中包含必填字段,并希望将存储在“ com_barchan_project ”中的值移动到此新的空表中。

任何人都可以帮助我完成这个SQL语句吗?

以下是新的“ com_barchan_project_subsector_join ”表格应如下所示:

| id | project_id | subsector_id |
+----+------------+--------------+
|  1 |      1     |      3       |
+----+------------+--------------+
|  2 |      1     |      4       |
+----+------------+--------------+
|  3 |      1     |      7       |
+----+------------+--------------+
|  4 |      2     |      2       |

移出数据后,我会从“ com_barchan_project ”表中删除“子部门”字段,然后完成。

感谢您的帮助!!!

约翰

1 个答案:

答案 0 :(得分:1)

使用较短的表名以简洁/清晰;并且假设您拥有(或可以轻松制作)全面的子部门表...并假设您的csv以一致的格式存储(至少没有空格)。

INSERT INTO `project_subsectors` (project_id, subsector_id)
SELECT p.id, s.id
FROM projects AS p
INNER JOIN subsectors AS s ON p.subsector = s.id
                           OR p.subsector LIKE CONCAT(s.id, ',%')
                           OR p.subsector LIKE CONCAT('%,', s.id, ',%')
                           OR p.subsector LIKE CONCAT('%,', s.id)
;

我无法保证它会很快;如果是的话,我会感到惊讶。

ON FIND_IN_SET(s.id, p.subsector) > 0也可以正常工作,但我对该功能的行为并不熟悉。