用于优先匹配模式/文本的 MySQL 逻辑

标签 mysql sql

我有一个带有简短描述的事件表。我试图根据该简短描述中的文本将它们分配到一个类别(我知道这并不理想,但我正在使用现有系统并且没有太多控制权)。因此,我创建了一个查找表,其中包含要查找的 search_text 以及应分配给事件的类别值。在某些情况下,多个 search_text 值与 Short_description 匹配。我想在发生这种情况时使用优先级字段来选择最高优先级(最低优先级值,例如1)。我觉得这可能涉及到窗口函数或其他东西,但我不知道如何处理它。

有人可以帮我修改下面的逻辑吗?

谢谢!

<小时/>

下面的查询返回两个结果,但我希望它只返回一个(集群),因为集群的优先级为 1,磁盘的优先级为 2。我只希望每个 snumber (事件)有一条记录。

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

关于用于优先匹配模式/文本的 MySQL 逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39024534/

相关文章:

mysql - 在 "GROUP BY"子句中重用 select 表达式的结果?

mysql - 从特定日期 sql 算起 12 个月的总和

sql - 本地 TSV 文件写入 SQL 表

php - MySql查询按顺序获取存储在数据库表中的Excel单元格位置

php - 将某一列的数据替换为另一列的数据 相同表名、相同列名不同数据库名

php - PDO 使用 BLOB(从表中获取图像)

php - MySQL OUTER JOIN 从连接表中获取单独的行结果

sql - 存储过程 SQL 执行计划

MySQL 按多个日期和结果分组总计

php - 连接两个表的最佳方法,其中 1 仅用于匹配