MySql манипулирование строками, выбор элементов из текста - PullRequest
2 голосов
/ 03 ноября 2011

У меня есть таблица «changesets», в которой есть столбец комментариев, где люди вводят ссылки на проблемы с ошибками в формате «Исправленная проблема # 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 Ответ

0 голосов
/ 05 декабря 2011

Вот один (раздутый / грязный) подход к получению нужного набора данных ...

Шаг 1 - выяснить, каково максимальное количество идентификаторов выдачи

SELECT MAX(LENGTH(comments)- LENGTH(REPLACE(comments,'#',''))) AS max_issues 
FROM change_sets

Шаг 2 - рекурсивно создайте запрос UNION с числом «уровней», равным максимальному количеству идентификаторов выдачи. Для вашего примера

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 |
+--------------+----------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...