2010-07-16 58 views
0

所以我有2个表:的SQLite - >寻找两个最接近的点到两个不同点

route(#id) 
step(#id,route_id,lat,lng,sequence_order) 

而且2 GPS坐标:M1(LAT1,lng1)M2(LAT2,lng2)。

所以,我想找到所有的路线,从2个GPS坐标的每个至少有一步距离1.0英里的距离,并且按升序排列。因此,如果我找到Route#25,它距M1有0.4英里的步骤S1,距离M2 0.2英里的步骤S2,只有S1的序列号比S2的序列号差。是否有意义 ?

假设我添加了一个函数来计算距离,我可以申请做很容易:

SELECT r.id,s1.lat,s1.lng,s2.lat,s2.lng,distance(s1.lat,s1.lng,lat1,lng1) as d1,distance(s2.lat,s2.lng,lat2,lng2) as d2 FROM route r 
INNER JOIN step s1 ON r.id = s1.route_id 
INNER JOIN step s2 ON r.id = s2.route_id AND s1.sequence_order < s2.sequence_order 
WHERE d1<1.0 
AND d2<1.0 

我想有行为,是只保留最近的坐标(s1.lat ,s1.lng)和(s2.lat,s2.lng)到我的点。所以我想我可以这样做:

ORDER BY d1 
ORDER BY d2 
GROUP BY r.id 

但它只是崩溃。

有什么想法?

+0

似乎每个'Route'都有一些序列化的'Steps'。但是什么是表'ZSTEP'?它看起来像你想要一个自我加入表“步骤”。也许真正的桌子被命名为'ZSTEP',并且为了这个问题的目的您将其名称更改为'Step',但忘记更改第二个实例?我在想这个太多了吗? ;) – onedaywhen 2010-07-16 11:26:32

+0

其实ZSTEP是我发布时忘记编辑的真名。 – Julien 2010-07-16 11:32:55

回答

1

你可能想

ORDER BY d1, d2 

为您的ORDER BY子句。无论如何,碰撞是什么?

+0

这是断言失败。实际上,ORDER BY d1,d2进行二级排序。我想要的是离第一点最近的点和离第二点最近的点。 – Julien 2010-07-16 11:28:21

+0

声明失败:我不知道这些,我必须承认。您可以扩展ORDER BY子句并具有ORDER BY d1 + d2;或ORDER BY myfunc(d1,d2);如果这有帮助。你不能有两个ORDER BY子句。 – 2010-07-16 11:33:40

+0

对不起,这不是断言失败。这是C错误... 其实我很想拥有d1和d2的最小值。 我正在尝试不同的方法,所以我会关闭这个问题。谢谢 – Julien 2010-07-16 11:39:02