首页 > 解决方案 > 查找存储过程中排名最高的匹配项

问题描述

我有需要指导/解决方案的情况。

我有一个包含以下订单的表格:

颜色
红色的 1
蓝色的 2
绿 3
黄色的 4
白色的 5
黑色的 6

我有另一个如下表

ID 颜色值
ID1 红色、黄色
ID2 绿
ID3 白色的
ID4 绿色,红色
ID5 黄色,白色,黑色

现在,第一个表根据优先级定义所选颜色,并希望将 colorValue 替换为排名最高的颜色(1 为高,6 为最低)。

我想要的输出如下:

ID 颜色值 要替换的值 原因
ID1 红色、黄色 红色的 红色的排名高于黄色
ID2 绿 绿
ID3 白色的 白色的
ID4 绿色,红色 红色的 红色的排名高于绿色
ID5 黄色,白色,黑色 黄色的 黄色在三种颜色中排名最高

请让我知道如何实现这一目标。

标签: mysqlsqljoincursorrank

解决方案


您可以加入表格并使用FIRST_VALUE()窗口函数来获得排名较高的颜色:

SELECT DISTINCT t2.id, t2.ColorValue, 
       FIRST_VALUE(t1.color) OVER (PARTITION BY t2.ColorValue ORDER BY t1.`rank`) Value_to_be_replaced
FROM table2 t2 INNER JOIN table1 t1
ON FIND_IN_SET(t1.color, t2.ColorValue)
ORDER BY t2.id

这将适用于 MySql 8.0+。

对于以前的版本,使用相关子查询:

SELECT t2.*,
       (
         SELECT t1.color
         FROM table1 t1
         WHERE FIND_IN_SET(t1.color, t2.ColorValue)
         ORDER BY t1.`rank` LIMIT 1
       ) Value_to_be_replaced
FROM table2 t2
ORDER BY t2.id

请参阅演示


推荐阅读