我有一张具有short_description的事件表。我正在尝试根据short_description中的文本将它们分配给类别(我知道这并不理想,但是我正在使用现有系统并且没有太多控制权)。因此,我创建了一个带有search_text的查找表,以查找要分配给事件的类别值。在某些情况下,多个short_description匹配search_text值。发生这种情况时,我想使用优先级字段选择最高优先级(最低优先级值,例如1)。我感觉这可能涉及到窗口函数或其他东西,但是我不确定如何实现它。
有人可以帮助我进行以下逻辑中的更改吗?
谢谢!
下面的查询返回两个结果,但是我希望它只返回一个结果(集群),因为群集优先级为1,磁盘优先级为2。我只希望每个数字一个记录(事件)。
CREATE TABLE snow_incident_s_2 (
SNUMBER varchar(40) DEFAULT NULL,
SHORT_DESCRIPTION varchar(200) DEFAULT NULL
);
INSERT INTO snow_incident_s_2 (snumber, short_description) values ('INC15535802','Prognosis::ADMINCLUSTER [5251]::CmaDiskPartitionNearFull, PROGNOSIS:ADMINCLUSTER');
CREATE TABLE lkp_incident_category_2 (
incident_category_id smallint(6) NOT NULL AUTO_INCREMENT,
incident_type varchar(10) DEFAULT NULL,
category varchar(100) NOT NULL,
search_text varchar(200) NOT NULL,
priority smallint(6) DEFAULT NULL,
PRIMARY KEY (incident_category_id)
);
INSERT INTO lkp_incident_category_2 (incident_type, category, search_text, priority) values ('INC','Cluster','Cluster',1);
INSERT INTO lkp_incident_category_2 (incident_type, category, search_text, priority) values ('INC','Disk','Disk',2);
SELECT
inc.snumber,
inc.short_description,
ic.search_text,
ic.category
FROM
snow_incident_s_2 inc
LEFT JOIN
lkp_incident_category_2 ic ON inc.short_description LIKE CONCAT('%', ic.search_text, '%')
AND ic.incident_type = 'INC'
最佳答案
窗口函数在mysql中不存在。但您可以使用变量来模仿它们。
我一直在尝试测试,但是sqlfiddle不合作,因此我认为这对您有用,请尝试一下。
SELECT *
FROM (
SELECT
inc.snumber
,inc.short_description
,ic.search_text
,ic.category
,(@rownum := IF(@incnum=inc.snumber,@rownum+1,1)) as IncidentRowNum
,@incnum := inc.snumber
FROM
snow_incident_s_2 inc
LEFT JOIN lkp_incident_category_2 ic
ON inc.short_description LIKE CONCAT('%', ic.search_text, '%')
AND ic.incident_type = 'INC'
CROSS JOIN (SELECT @rownum := 0, @incnum := '') var
ORDER BY
ic.priority
) t
WHERE
t.IncidentRowNum = 1
;
经过全面测试和功能,这是它的sqlfiddle http://sqlfiddle.com/#!9/75ff1/7