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