查找存储过程中排名最高的匹配项

Finding The top ranked match in stored procedure

我有一个情况需要guidance/solution。

我有一个 table,其中包含如下订单:

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

我还有一个 table 如下所示

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

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

我想要的输出如下:

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

请告诉我如何实现。

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

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

参见demo