流段的上游查询

mysql 8.0环境

使用"点位"表(positions),主键id,点位类型position_type_id(监测点、汇接点),经纬度,表中已有监测点记录,补充汇接点数据;

创建"流段"表(b_flow_segment),主键id,入口点in_pos_id,出口点out_pos_id,途经路径,,录输入所有监测点和汇接点之间的流段;

递归查询:点位30的所有上游管段:

sql 复制代码
with recursive t as (SELECT * FROM `b_flow_segment` WHERE out_pos_id=30 union all select a.* from b_flow_segment a join t on a.out_pos_id = t.in_pos_id) select id,in_pos_id,out_pos_id from t

递归查询:点位30的所有上游监测点:

sql 复制代码
with recursive t as (SELECT * FROM `b_flow_segment` WHERE out_pos_id=30 union all select a.* from b_flow_segment a join t on a.out_pos_id = t.in_pos_id) select t.id,t.in_pos_id,positions.title from t left join positions on t.in_pos_id=positions.id where positions.position_type_id=46

查询点位30到点位5之间的管段:

。。。

查询5点位到24点位间的路径:

sql 复制代码
WITH RECURSIVE shortest_path(in_pos, out_pos, depth, path) AS (
    SELECT 
        in_pos, 
        out_pos, 
        1, 
        concat(CAST(in_pos AS CHAR) ,',' , CAST(out_pos AS CHAR)) 
    FROM b_flow_segment
    WHERE in_pos = 5

    UNION ALL

    SELECT 
        a.in_pos, 
        a.out_pos, 
        shortest_path.depth + 1, 
        CONCAT(shortest_path.path, ',', CAST(a.out_pos AS CHAR))
    FROM shortest_path
    JOIN b_flow_segment a ON shortest_path.out_pos = a.in_pos
    WHERE shortest_path.depth <= 9
)
SELECT * FROM shortest_path 
where out_pos=24
ORDER BY depth
相关推荐
曹牧44 分钟前
Oracle:字段值中含有单引号
数据库·oracle
qing222222221 小时前
非void函数缺少返回值导致的程序崩溃
数据库
shyの同学1 小时前
Spring事务:为什么catch了异常,事务还是回滚了?
数据库·spring·事务·spring事务
xuanloyer1 小时前
oracle从入门到精通--物理存储结构
数据库·oracle
chenzhou__1 小时前
LinuxC语言并发程序笔记补充
linux·c语言·数据库·笔记·学习·进程
IT教程资源D1 小时前
[N_128]基于springboot,vue酒店管理系统
mysql·vue·前后端分离·酒店管理系统·springboot酒店管理
别或许1 小时前
14、使用C++连接MySQL及接口
数据库·mysql
阿里云云原生1 小时前
阿里云 ARMS 自定义指标采集:打破传统 APM 局限,实现业务可视化监控
数据库·阿里云·云原生·oracle·arms
lu9up1 小时前
业务表异常阻塞导致接口超时处理案例
数据库·性能优化