Select 根据列数据的优先级记录 - mysql

Select records according to data's priority of a column - mysql

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 question.I想做的是根据medium的值创建一个唯一行的列表,如果所有medium记录都存在,则优先考虑air,train和road对于相同的点。 Note:Priority顺序是航空>火车>公路。

您可以使用相关子查询进行过滤:

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

您可以使用函数 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    |