代码之家  ›  专栏  ›  技术社区  ›  Thomas O

查找具有给定节点的所有方法

  •  1
  • Thomas O  · 技术社区  · 14 年前

    我有一个方法和节点数据库。一个方法由两个或多个节点定义。方法包含的节点\u id列表存储在方法\u node s表中。

    我有一个节点连接表,两个或多个连接方式的点。连接被定义为具有相同节点的两种或多种方式。我正在寻找加入的方法。所以试着这样做:

    SELECT DISTINCT 
           way_id 
      FROM way_nodes wn 
      JOIN path_vectors pv ON pv.node_id = wn.node_id
    

    表路径向量包含所有节点的列表,这些节点是在两种方法之间连接的,它是预先计算的。

    我发现它太慢了,可能是每秒5路,我的大型~10000路和~40000节点数据库。这是 related to my previous question .

    这些信息的目标是将道路网络简化为一个简单的图表,该图表可与探路者一起用于绘制最佳路线。我使用的是开放式街道地图数据,因此使用了类似的术语。

    3 回复  |  直到 14 年前
        1
  •  0
  •   user359040    14 年前

    据我所知,您正试图从way_nodes表构建一个所有way_id值的列表,其中path_vectors表上有一个对应的node_id。

    如果 全部的 节点ID值存储在路径向量表中,这可以简化为:

    select distinct way_id from way_nodes
    

    如果 所有节点的id值都存储在路径向量表中,这是 可以 是查询值的最有效方法:

    select distinct way_id from way_nodes wn
    where exists
    (select null from path_vectors pv
     where wn.node_id = pv.node_id)
    

    我建议检查路径向量表上的node_id字段是否有索引。

        2
  •  0
  •   Jeremiah Nunn    14 年前

    除非我误解了什么,否则方式节点是一种方式和构成方式的节点之间的映射。您应该能够只查询一个表来查找给定节点的所有方法。

    SELECT DISTINCT way_id FROM way_nodes WHERE node_id = XYZ;
    

    除非问题是如何为所有节点执行此操作…

        3
  •  0
  •   Lee    14 年前

    考虑一下……

    select node_id, count(distinct node_id)
    from way_nodes 
    group by node_id
    having count(distinct way_id) > 1
    

    那会给你所有的身份证 nodes 不止一个 way 相关。

    现在,只需将它与一个简单的查询结合起来,回到另一个方向,就可以得到 way_id S:

    SELECT way_id
    FROM way_nodes JOIN (
        select node_id, count(distinct node_id)
        from way_nodes 
        group by node_id
        having count(distinct way_id) > 1
    ) as nn ON ( way_nodes.node_id = nn.node_id )
    GROUP BY way_nodes.way_id
    

    我没有你的数据库,所以我不能测试它…但类似的事情应该奏效。如果你不能让它工作,那就把它寄回去,我们会帮你解决的。


    [编辑]

    表路径向量包含所有节点的列表,这些节点是在两种方法之间连接的,它是预先计算的。

    所以…鉴于此,您可以这样做:

    SELECT way_nodes.way_id
    FROM 
      way_nodes
      JOIN
      path_vectors
      ON (path_vectors.node_id = way_nodes.node_id)
    GROUP BY way_nodes.way_id