查找存储过程中排名最高的匹配项
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。
我有一个情况需要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。