根据列的数据优先级选择记录 - mysql
Posted
技术标签:
【中文标题】根据列的数据优先级选择记录 - mysql【英文标题】:Select records according to data's priority of a column - mysql 【发布时间】:2020-06-23 05:53:42 【问题描述】:connections_tbl
point1 point2 medium
ktm pkr air
pkr ktm road
pkr baglung road
baglung palpa road
ktm brt air
brt ktm road
baglung pkr train
需要的输出
point1 point2 medium
ktm pkr air
pkr baglung train
baglung palpa road
ktm brt air
我的问题类似于this 问题。我想做的是根据介质的值创建一个唯一行列表,如果所有介质记录都存在于相同的点,则优先考虑航空、火车和公路。 注意:优先顺序是air>train>road。
【问题讨论】:
【参考方案1】:您可以使用函数least()
和greatest()
,因为点可以互换:
select t.point1, t.point2, t.medium
from (
select *,
row_number() over(
partition by least(point1, point2), greatest(point1, point2)
order by field(medium, 'air', 'train', 'road')
) rn
from connections_tbl
) t
where t.rn = 1
请参阅demo。 结果:
| point1 | point2 | medium |
| ------- | ------ | ------ |
| baglung | palpa | road |
| baglung | pkr | train |
| ktm | brt | air |
| ktm | pkr | air |
【讨论】:
您的解决方案对我们来说几乎是正确的。请再次检查修改后的问题。 point1 和 point 2 的值可以互换。例如。 ktm 可以在 point1 列或 point2 列中 你的mysql是什么版本 yessss..终于。非常感谢您的解决方案。 :) @forpas【参考方案2】:您可以使用相关子查询进行过滤:
select c.*
from connections_tbl c
where c.medium = (
select c1.medium
from connections_tbl c1
where c1.point1 = c.point1 and c1.point2 = c.point2
order by field(medium, 'air', 'train', 'road')
limit 1
) t
或者,在 MySQL 8.0 中,您可以使用 row_number()
:
select point1, point2, medium
from (
select
c.*,
row_number() over(partition by point1, point2 order by field(medium, 'air', 'train', 'road')) rn
from connections_tbl c
) t
where rn = 1
【讨论】:
第一个查询中的 t 是什么意思。 两个查询都做同样的事情,即根据优先级规则为每个(point1, point2)
元组生成一条记录。第一个查询使用一个相关子查询,它为每个元组返回最高优先级medium
。
当我写 t 时它会给我一个错误,如果不写 t,它会给出输出但不是预期的输出。给出表中的所有记录。
您的第二个查询处理了之前的问题。感谢那 。请再次检查,我已经修改了问题,point1 值可以在 point2 中,反之亦然。即ktm pkr air
pkr ktm road
以上是关于根据列的数据优先级选择记录 - mysql的主要内容,如果未能解决你的问题,请参考以下文章