mysql - 查找存储过程中排名最高的匹配项
问题描述
我有需要指导/解决方案的情况。
我有一个包含以下订单的表格:
颜色 | 秩 |
---|---|
红色的 | 1 |
蓝色的 | 2 |
绿 | 3 |
黄色的 | 4 |
白色的 | 5 |
黑色的 | 6 |
我有另一个如下表
ID | 颜色值 |
---|---|
ID1 | 红色、黄色 |
ID2 | 绿 |
ID3 | 白色的 |
ID4 | 绿色,红色 |
ID5 | 黄色,白色,黑色 |
现在,第一个表根据优先级定义所选颜色,并希望将 colorValue 替换为排名最高的颜色(1 为高,6 为最低)。
我想要的输出如下:
ID | 颜色值 | 要替换的值 | 原因 | |
---|---|---|---|---|
ID1 | 红色、黄色 | 红色的 | 红色的排名高于黄色 | |
ID2 | 绿 | 绿 | ||
ID3 | 白色的 | 白色的 | ||
ID4 | 绿色,红色 | 红色的 | 红色的排名高于绿色 | |
ID5 | 黄色,白色,黑色 | 黄色的 | 黄色在三种颜色中排名最高 |
请让我知道如何实现这一目标。
解决方案
您可以加入表格并使用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
请参阅演示。
推荐阅读
- c# - 如何在我的 CheckBox 中显示选中的项目
- typescript - 在打字稿中创建一个界面,其中只允许两个属性之一?
- python - CNN 仅针对 binary_crossentropy 损失函数收敛并且在测试数据集上失败
- android - ViewModelProviders 已经过时了,应该换什么?
- php - 如何在不使用 API 的情况下生成 Trx 钱包
- django - 为 Django 查询集组合过滤器
- javascript - 如何将数量增加一并跟踪单击的项目?
- python - Python Tkinter - 小部件出错 - TclError:预期整数但得到“新”
- c - 未知错误函数'scanf("%[^\n]%*c", &sent);'
- html - 如果添加相对定位的元素,如何阻止 flexbox 容器增长?