我有一个“changesets”表,其中有一个comments列,人们在其中以“Fixed issue#2345-……”格式输入对bug问题的引用,但也可以是“Fixed issuesා456、ා2956、ා12345….”
选择这些参考号的最佳方法是什么,这样我可以通过连接访问问题。
给定此更改集表
id comments
===========================
1 fixed issue #234 ....
2 DES - #789, #7895, #123
3 closed ticket #129
我想要这样的结果
changeset_id issue_id
=====================
1 234
2 789
2 7895
2 123
3 129
我使用了substring_index(substring_index('#',-1),'',1)类型构造,但它每行只返回一个引用。
同时寻找最有效的方法来进行文本查找
感谢任何帮助
谢谢
最佳答案
这里有一个(臃肿/凌乱)方法来获得所需的数据集。。。
第1步——找出问题ID最大值是多少
SELECT MAX(LENGTH(comments)- LENGTH(REPLACE(comments,'#',''))) AS max_issues
FROM change_sets
第2步-递归创建一个联合的查询,其中有许多“级别”等于问题ID的最大数量。以你为例,
SELECT changeset_id, issue_id FROM
(
SELECT id AS changeset_id, CAST(SUBSTRING_INDEX(comments,'#',-1) AS UNSIGNED) AS issue_id FROM change_sets
UNION
SELECT id AS changeset_id, CAST(SUBSTRING_INDEX(comments,'#',-2) AS UNSIGNED) AS issue_id FROM change_sets
UNION
SELECT id AS changeset_id, CAST(SUBSTRING_INDEX(comments,'#',-3) AS UNSIGNED) AS issue_id FROM change_sets
) a
HAVING issue_id!=0
ORDER BY changeset_id, issue_id
我利用UNION删除重复行的能力,以及CAST在决定整数时使用前导数值的能力。
使用玩具数据集的结果:
+--------------+----------+
| changeset_id | issue_id |
+--------------+----------+
| 1 | 234 |
| 2 | 123 |
| 2 | 789 |
| 2 | 7895 |
| 3 | 129 |
+--------------+----------+
关于mysql - MySql字符串操作,从文本中选择项目,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8001011/