我继承了一个项目,该项目在名为“ 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 ”表中删除“子部门”字段,然后完成。
感谢您的帮助!!!
约翰
答案 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
也可以正常工作,但我对该功能的行为并不熟悉。