为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
交互式爱情 2022-10-28 10:09:52
连接_tblpoint1   point2   mediumktm      pkr      airpkr      ktm      roadpkr      baglung  roadbaglung  palpa    roadktm      brt      airbrt      ktm      roadbaglung  pkr      train所需输出point1   point2   mediumktm      pkr      airpkr      baglung  trainbaglung  palpa    roadktm      brt      air我的问题与这个问题类似。我想做的是根据介质的值创建一个唯一行列表,如果所有介质记录都存在于相同的点,则优先于航空、火车和道路。注意:优先顺序是航空>火车>公路。
查看完整描述

2 回答

?
守着一只汪

TA贡献1872条经验 获得超3个赞

您可以使用这些功能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    |


查看完整回答
反对 回复 2022-10-28
?
慕村9548890

TA贡献1884条经验 获得超4个赞

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


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


查看完整回答
反对 回复 2022-10-28
  • 2 回答
  • 0 关注
  • 96 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信