【问题标题】:MySql string manipulation, selecting items from textMySql 字符串操作,从文本中选择项目
【发布时间】:2011-12-21 12:12:44
【问题描述】:

我有一个“变更集”表,其中有一个 cmets 列,人们在其中输入对错误问题的引用,格式为“Fixed issue #2345 - ......”,但也可以是“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) 类型构造,但每行只会返回一个引用。

也在寻找最有效的文本查找方式

任何帮助表示赞赏

谢谢

【问题讨论】:

  • 我认为这将是一个需要解决的棘手问题。是否必须全部在 SQL 中?在您的应用程序中确实有一些事情更容易完成,例如使用“#”获取所有 cmets,然后解析出数字并对其进行处理。

标签: mysql string text full-text-search


【解决方案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 |
+--------------+----------+

【讨论】:

    猜你喜欢
    • 2012-04-25
    • 2014-11-25
    • 2013-06-15
    • 2011-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多