流段的上游查询

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
相关推荐
云老大TG:@yunlaoda36011 小时前
华为云国际站代理商TaurusDB的成本优化体现在哪些方面?
大数据·网络·数据库·华为云
TG:@yunlaoda360 云老大12 小时前
华为云国际站代理商GeminiDB的企业级高可用具体是如何实现的?
服务器·网络·数据库·华为云
最贪吃的虎13 小时前
Git: rebase vs merge
java·运维·git·后端·mysql
QQ142207844913 小时前
没有这个数据库账户,难道受到了sql注入式攻击?
数据库·sql
残 风14 小时前
pg兼容mysql框架之语法解析层(openHalo开源项目解析)
数据库·mysql·开源
勇往直前plus14 小时前
MyBatis/MyBatis-Plus类型转换器深度解析:从基础原理到自定义实践
数据库·oracle·mybatis
cyhysr14 小时前
sql将表字段不相关的内容关联到一起
数据库·sql
九皇叔叔14 小时前
MySQL 数据库 MVCC 机制
数据库·mysql
此生只爱蛋14 小时前
【Redis】Set 集合
数据库·redis·缓存
bjzhang7514 小时前
C#操作SQLite数据库
数据库·sqlite·c#