Выберите записи в соответствии с приоритетом данных столбца - mysql - PullRequest
1 голос
/ 11 марта 2020

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

Моя проблема похожа на этот вопрос. Я хочу создать список уникальных строк на основе по значению среды, с приоритетом воздуха, поезда и дороги, если все записи среды существуют для одних и тех же точек. Примечание. Приоритетный порядок: воздух> поезд> дорога.

Ответы [ 2 ]

1 голос
/ 11 марта 2020

Вы можете использовать функции 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

См. Демонстрационную версию . Результаты:

| point1  | point2 | medium |
| ------- | ------ | ------ |
| baglung | palpa  | road   |
| baglung | pkr    | train  |
| ktm     | brt    | air    |
| ktm     | pkr    | air    |
1 голос
/ 11 марта 2020

Вы можете фильтровать с помощью коррелированного подзапроса:

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