与CONCAT一起使用时,SQL命令挂在查询上

时间:2019-03-14 14:56:22

标签: mysql sql select concatenation

我在Jira数据库上的MySQL上运行以下命令:

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(),但是它仍然使数据库的搜索变得疯狂。 CPU达到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

2 个答案:

答案 0 :(得分:0)

您可以尝试使用:SUBSTRING_INDEX(str, delim, count)

您的情况:SUBSTRING_INDEX(LOCAL_ISSUE_KEY, "-", 1)

不要使用CONCAT,因为它太重了,因为您需要在子查询中更改所有结果。

甚至更好: RIGHT(str, len)->代替len,使用SUBSTRING_INDEX

答案 1 :(得分:0)

我不知道您的桌子有多大,即存储了多少个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"
    )
  )
;