MySql 字符串操作,从文本中选择项目

标签 mysql string text full-text-search

我有一个“变更集”表,其中有一个注释列,人们可以在其中以“已修复问题 #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/

相关文章:

php - Laravel 在选择列表中获取更多数据

python重新查找可能包含括号的字符串

text - RobotFramework,如何检查页面上的文本

javascript - 通过 html 表单更新 mysql 表的最简单方法

来自 5.7 的 mysql 8 查询回归(有什么问题?)

java - 准备语句错误: Parameter 12 undefined

objective-c - 我们如何测量 Cocoa 中文本的可见边界?

c++ - std string对象的内部结构

string - Clojure 从字符串中获取表单

scala - 如何在每行中添加行号?