我有一个“变更集”表,其中有一个注释列,人们可以在其中以“已修复问题 #2345 - ......”的格式输入对错误问题的引用,但也可以是“已修复问题 #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 步 - 递归地创建一个 UNION 查询,其“级别”数量等于问题 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 字符串操作,从文本中选择项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8001011/