找到具有给定节点的所有方式

时间:2010-11-02 18:33:01

标签: sql sqlite

我有一个方法和节点的数据库。方式由两个或更多节点定义。方式包含的node_id列表存储在way_nodes表中。

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

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

表path_vectors包含所有节点之间连接的节点的列表,它是预先计算的。

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

此信息的目标是将道路网络简化为简单的图形,可以与路径查找器一起使用以绘制最佳路线。我正在使用Open Street Map数据,因此使用类似的术语。

3 个答案:

答案 0 :(得分:0)

除非我误解了某些内容,否则way_nodes是一种方式与构成该方式的节点之间的映射。您应该只能查询一个表以查找给定节点的所有方法。

SELECT DISTINCT way_id FROM way_nodes WHERE node_id = XYZ;

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

答案 1 :(得分:0)

考虑这个......

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

这会为您提供与nodes相关联的所有way的ID。

现在只需将其与另一个方向的简单查询相结合,即可获得所有way_id

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

我没有你的数据库,所以我无法测试它......但是这样的东西应该可行。如果你无法使用它,那么回复,我们将帮助你解决它。


[编辑]

  

“表path_vectors包含所有节点之间连接的节点的列表,它是预先计算的。”

所以......鉴于此,你可以这样做:

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

答案 2 :(得分:0)

据我了解,您正在尝试从way_nodes表构建所有way_id值的列表,其中path_vectors表上有相应的node_id。

如果所有 node_id值都存储在path_vectors表中,则可以简化为:

select distinct way_id from way_nodes

如果所有node_id值都存储在path_vectors表中,则此可能是查询值的最有效方式:

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

我建议检查path_vectors表上的node_id字段是否有索引。