根据列的数据优先级选择记录 - 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 airpkr ktm road

以上是关于根据列的数据优先级选择记录 - mysql的主要内容,如果未能解决你的问题,请参考以下文章

SQL Select 根据多个状态字段值识别设备状态

Mysql中联合索引的最左匹配原则(百度)

Mysql的排序顺序

根据优先级参考表选择列值?

根据 Oracle 的 SQL 中的优先级返回每个键的行

数据结构:优先队列-最大最小优先