我有一个方法和节点的数据库。方式由两个或更多节点定义。方式包含的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数据,因此使用类似的术语。
答案 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字段是否有索引。