MySQL 递归查询 VARCHAR 字段

MySQL recursive queries up on VARCHAR fields

我在 MySQL 中有一个关系,其中包括地理空间数据,其中包括道路沿线的一些公共汽车停靠点。我知道在 RDBMS 中处理此问题的方法是使用两个字段 ,其中两者都是 VARCHAR 而 下一个巴士站。我想要的是对 select 一条路径的这种关系进行递归查询。我该怎么办?

我实际上建议使用字段 halt_idhalt_prev。这样做的原因是,要找到一条路线中的第一个公共汽车停靠点,您必须找到一个之前没有停靠过的公共汽车站(即 halt_prev is null)。

select s1.halt_id, s2.halt_id, s3.halt_id
from Halt h1
left join Halt h2 on h2.halt_prev = h1.halt_id
left join Halt h3 on h3.halt_prev = h2.halt_id
where h1.prev_halt is null

这假设路线不是循环的;如果是,最好也使用 route_id 字段并将其限制为每个 route_id 一条记录,如下所示:

select o.route_id, i.halt1_id, i.halt2_id, i.halt3_id, i.halt4_id
from (select route_id, MIN(halt_id) halt_id_min
      from Halt
      group by route_id) o
join (select h1.route_id, h1.halt_id halt1_id, h2.halt_id halt2_id, h3.halt_id halt3_id, h4.halt_id halt4_id
      from Halt h1
      left join Halt h2 on h2.halt_prev = h1.halt_id
      left join Halt h3 on h3.halt_prev = h2.halt_id
      left join Halt h4 on h4.halt_prev = h3.halt_id
      where h2.halt_id not in (h1.halt_id)
      and h3.halt_id not in (h1.halt_id, h2.halt_id)
      and h4.halt_id not in (h1.halt_id, h2.halt_id, h3.halt_id)) i on i.route_id = o.route_id and i.halt1_id = halt_id_min

在这两个查询中,left join 的数量和 select 语句中的列(以及,在循环路由的情况下,where 子句中的条件数量, 减 1) 应等于最长路线中的公交车停靠点数量(或在环形路线的情况下,一条路线中唯一停靠点的数量)。