#mysql #sql #select #concatenation
#mysql #sql #выберите #конкатенация
Вопрос:
У меня есть следующие команды, которые я запускаю в MySQL в базе данных Jira:
SELECT LOCAL_ISSUE_KEY , REMOTE_ISSUE_KEY
FROM AO_A912D8_SYNC_INFORMATION
WHERE substr(LOCAL_ISSUE_KEY, 5)
IN
(SELECT issuenum
FROM jiraissue
WHERE issuetype
IN
(SELECT ID
FROM issuetype
WHERE pname = "Story"
)
)
;
Это работает как шарм, однако я не удовлетворен, поскольку длина значения в LOCAL_ISSUE_KEY
является переменной: EFW-12345 или FWAI-5432. Поэтому мне пришлось бы изменить на substr(LOCAL_ISSUE_KEY, 5)
или substr(LOCAL_ISSUE_KEY, 6)
Итак, я хотел сделать что-то другое и WHERE IN
проверить правильность строки благодаря CONCAT()
вместо вычитания ее части.
В качестве черновика я сначала попробовал с этим:
SELECT LOCAL_ISSUE_KEY , REMOTE_ISSUE_KEY
FROM AO_A912D8_SYNC_INFORMATION
WHERE LOCAL_ISSUE_KEY
IN
(SELECT CONCAT('EFW-',issuenum)
FROM jiraissue
WHERE issuetype
IN
(SELECT ID
FROM issuetype
WHERE pname = "Story"
)
)
;
Но это не работает, запрос продолжается вечно
Обратите внимание, что он мог бы выполнить запрос с помощью чего-то подобного:
SELECT LOCAL_ISSUE_KEY , REMOTE_ISSUE_KEY
FROM AO_A912D8_SYNC_INFORMATION
WHERE LOCAL_ISSUE_KEY
IN
(CONCAT('EFW-','58276'))
;
Я также пробовал использовать больше ()
вокруг SELECT CONCAT()
, но это все равно заставляло базу данных искать как сумасшедшую. Загрузка процессора достигает 100%.
Для информации, запрос на втором SELECT
работает:
SELECT CONCAT('EFW-',issuenum) FROM jiraissue WHERE issuetype IN (SELECT ID FROM issuetype WHERE pname = "Story" );
10610 rows in set (0.06 sec)
Вот как образец данных:
issuetype
ID pname
10000 Epic
10001 Story
jiraissue
ID issuenum PROJECT issuetype
154705 1942 12000 10001
project
ID pname pkey
12000 myproject EFW
AO_A912D8_SYNC_INFORMATION
LOCAL_ISSUE_KEY REMOTE_ISSUE_KEY
EFW-1942 ABC-12354
Комментарии:
1. что означает «поскольку длина является переменной».
2. Вопросы производительности должны включать
EXPLAIN
и некоторую информацию о размере таблицы, индексе, производительности в текущее время, времени ожидания и т.д.Slow
это относительный термин, и нам нужно реальное значение для сравнения.3. Примеры данных и желаемые результаты действительно помогли бы ВАМ
Ответ №1:
Вы можете попробовать использовать: SUBSTRING_INDEX(str, delim, count)
В вашем случае: SUBSTRING_INDEX(LOCAL_ISSUE_KEY, "-", 1)
Не используйте CONCAT
, потому что это слишком тяжело, так как вам нужно изменить весь результат в подзапросе.
или даже лучше: RIGHT(str, len)
-> вместо len используйте SUBSTRING_INDEX
Комментарии:
1. Где я могу это использовать, в моем примере? Это похоже на то, что у меня уже есть
substr()
2. Вы можете использовать это в substr(LOCAL_ISSUE_KEY, SUBSTRING_INDEX(LOCAL_ISSUE_KEY, «-«, 1)), поэтому вместо использования константы 5
3. Не совсем то, что я хочу. Это позволяет получить вторую часть строки
ABC-12345
благодаряSUBSTRING_INDEX(LOCAL_ISSUE_KEY, "-", -1)
(с минусом, чтобы получить другую сторону). Но я бы получил некоторые вещи, которые мне не нужны. Например, если у меня естьABC-123
иDEF-123
, это будет в два раза больше, чем 123. Все еще спасибо за ввод. Я пробовал сRIGHT
SUBSTRING_INDEX
, но это не работает4. Пожалуйста. Вы упомянули только EFW-12345 или FWAI-5432. Если у вас есть ABC-123 и DEF-123, просто отметьте в where условие, которое вы хотите исключить…
Ответ №2:
Я не знаю, насколько велики ваши таблицы, т. Е. Сколько jiraissues или проектов хранится. Но вы пробовали, работает ли это быстрее?
SELECT LOCAL_ISSUE_KEY , REMOTE_ISSUE_KEY
FROM AO_A912D8_SYNC_INFORMATION
WHERE LOCAL_ISSUE_KEY
IN
(SELECT distinct CONCAT('EFW-',issuenum)
FROM jiraissue
WHERE issuetype
IN
(SELECT distinct ID
FROM issuetype
WHERE pname = "Story"
)
)
;