如何使用 SQL 提取 JIRA 问题的自定义字段数据?
How do I use SQL to extract custom field data for JIRA issues?
我正在尝试从 jiaissue
table 中提取数据,以及来自同一问题的自定义字段中的数据。某些自定义字段的值在 customfieldvalue
table 中,而另一些自定义字段的值在 customfieldoption
table.
中
这是我目前的情况:
SELECT i.id, i.pkey
FROM jiraissue i
JOIN project p on i.project = p.id and p.id = 111 and i.resolutiondate IS NOT NULL
JOIN issuetype it on it.id = i.issuetype and it.id = 01
LEFT JOIN (SELECT cfv.issue, cf.cfname, cfo.customvalue
from customfieldvalue cfv
join customfield cf on cf.ID = cfv.CUSTOMFIELD and cf.id = 303
join customfieldoption cfo on cfo.id = cfv.stringvalue and cfo.parentoptionid is null and cfo.customvalue = 'X') u on u.ISSUE = i.ID
LEFT JOIN (SELECT cfv.issue, cf.cfname, cfv.textvalue
FROM customfieldvalue cfv
JOIN customfield cf ON cf.ID = cfv.CUSTOMFIELD AND cf.id = 505) fci ON fci.ISSUE = i.ID
以上代码有效,但速度很慢。底层数据库是 MySQL.
MySQL 传统上在使用子查询时性能很差,因为它没有使用索引或在查询优化部分表现得很好。 (我相信这在 MySQL 5.6.x 左右的某个地方得到了改进。)
与此同时,您可以做的一件事是使用 temp tables 自己实现查询。我从查询中删除了 project
和 issuetype
table,因为不需要它们只是为了过滤问题中的相关属性。最后,我还优化了 customfield
table 的额外连接。 (由于您已经通过特定的自定义字段 ID 对其进行了查询,因此您可能已经知道字段名称。)
create temporary table cfu AS
select cfv.issue, cfo.customvalue
from customfieldvalue cfv
join customfieldoption cfo on cfo.id = cfv.stringvalue and cfo.parentoptionid is null
WHERE cfo.customvalue = 'X' AND CFV.customfield=303;
create temporary table cffci AS
SELECT cfv.issue, cfv.textvalue
FROM customfieldvalue cfv
WHERE CFV.customfield=505;
alter table cfu add index idx_cfu_issue(issue);
alter table cffci add index idx_cffci_issue(issue);
select i.id, i.pkey, cfu.customvalue, cffci.textvalue
from jiraissue i
LEFT JOIN cfu on cfu.ISSUE = i.ID
LEFT JOIN cffci ON cffci.ISSUE = i.ID
WHERE i.resolutiondate IS NOT NULL AND i.project=111 AND i.issuetype=01
我正在尝试从 jiaissue
table 中提取数据,以及来自同一问题的自定义字段中的数据。某些自定义字段的值在 customfieldvalue
table 中,而另一些自定义字段的值在 customfieldoption
table.
这是我目前的情况:
SELECT i.id, i.pkey
FROM jiraissue i
JOIN project p on i.project = p.id and p.id = 111 and i.resolutiondate IS NOT NULL
JOIN issuetype it on it.id = i.issuetype and it.id = 01
LEFT JOIN (SELECT cfv.issue, cf.cfname, cfo.customvalue
from customfieldvalue cfv
join customfield cf on cf.ID = cfv.CUSTOMFIELD and cf.id = 303
join customfieldoption cfo on cfo.id = cfv.stringvalue and cfo.parentoptionid is null and cfo.customvalue = 'X') u on u.ISSUE = i.ID
LEFT JOIN (SELECT cfv.issue, cf.cfname, cfv.textvalue
FROM customfieldvalue cfv
JOIN customfield cf ON cf.ID = cfv.CUSTOMFIELD AND cf.id = 505) fci ON fci.ISSUE = i.ID
以上代码有效,但速度很慢。底层数据库是 MySQL.
MySQL 传统上在使用子查询时性能很差,因为它没有使用索引或在查询优化部分表现得很好。 (我相信这在 MySQL 5.6.x 左右的某个地方得到了改进。)
与此同时,您可以做的一件事是使用 temp tables 自己实现查询。我从查询中删除了 project
和 issuetype
table,因为不需要它们只是为了过滤问题中的相关属性。最后,我还优化了 customfield
table 的额外连接。 (由于您已经通过特定的自定义字段 ID 对其进行了查询,因此您可能已经知道字段名称。)
create temporary table cfu AS
select cfv.issue, cfo.customvalue
from customfieldvalue cfv
join customfieldoption cfo on cfo.id = cfv.stringvalue and cfo.parentoptionid is null
WHERE cfo.customvalue = 'X' AND CFV.customfield=303;
create temporary table cffci AS
SELECT cfv.issue, cfv.textvalue
FROM customfieldvalue cfv
WHERE CFV.customfield=505;
alter table cfu add index idx_cfu_issue(issue);
alter table cffci add index idx_cffci_issue(issue);
select i.id, i.pkey, cfu.customvalue, cffci.textvalue
from jiraissue i
LEFT JOIN cfu on cfu.ISSUE = i.ID
LEFT JOIN cffci ON cffci.ISSUE = i.ID
WHERE i.resolutiondate IS NOT NULL AND i.project=111 AND i.issuetype=01