流段的上游查询

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
相关推荐
松涛和鸣2 分钟前
72、IMX6ULL驱动实战:设备树(DTS/DTB)+ GPIO子系统+Platform总线
linux·服务器·arm开发·数据库·单片机
likangbinlxa19 分钟前
【Oracle11g SQL详解】UPDATE 和 DELETE 操作的正确使用
数据库·sql
r i c k1 小时前
数据库系统学习笔记
数据库·笔记·学习
野犬寒鸦1 小时前
从零起步学习JVM || 第一章:类加载器与双亲委派机制模型详解
java·jvm·数据库·后端·学习
IvorySQL2 小时前
PostgreSQL 分区表的 ALTER TABLE 语句执行机制解析
数据库·postgresql·开源
·云扬·2 小时前
MySQL 8.0 Redo Log 归档与禁用实战指南
android·数据库·mysql
野生技术架构师2 小时前
SQL语句性能优化分析及解决方案
android·sql·性能优化
IT邦德2 小时前
Oracle 26ai DataGuard 搭建(RAC到单机)
数据库·oracle
惊讶的猫2 小时前
redis分片集群
数据库·redis·缓存·分片集群·海量数据存储·高并发写