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 |
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 |