SQLite:查找函数的最小值

时间:2010-07-27 23:57:05

标签: sql sqlite request geography gis

我有那些表

Node (#id, route_id, lat, lng)

路线(#ID)

我有四个输入值:$ lat1,$ lng1,$ lat2,$ lng2,它们代表2个GPS坐标GPS1和GPS2。 我还有一个我添加到数据库的距离函数:distance(lat1,lng1,lat2,lng2)

我正在寻找的是能给我最近点GPS1的请求,以及每条路线最接近GPS2的点。 所以我想它应该像:

SELECT r.id, n1.lat, n1.lng, n2.lat, n2.lng
FROM Node n1, Node n2
JOIN Route r ON n1.route_id = r.id AND n2.route_id = r.id

我试图添加

WHERE distance(n1.lat,n1.lng,$lat1,$lng1) = MIN (distance(n1.lat,n1.lng,$lat1,$lng1))
AND distance(n2.lat,n2.lng,$lat2,$lng2) = MIN (distance(n2.lat,n2.lng,$lat2,$lng2))

但它引发了这个错误:

"misuse of aggregate function MIN()"

我还以为我可以用

SELECT r.id, n1.lat, n1.lng, n2.lat, n2.lng, distance(n1.lat,n1.lng,$lat1,$lng1) AS d1, distance(n2.lat,n2.lng,$lat2,$lng2) AS d2
FROM Node n1, Node n2
JOIN Route r ON n1.route_id = r.id AND n2.route_id = r.id
GROUP BY r.id

用d1为n1.lat,n1.lng,d1列排序,用d2为n2.lat,n2.lng,d2列排序,但我不知道怎么做。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您需要执行相关查询:

SELECT r.id, n1.lat, n1.lng, n2.lat, n2.lng
FROM Node n1, Node n2
JOIN Route r ON n1.route_id = r.id AND n2.route_id = r.id
WHERE distance(n1.lat,n1.lng,$lat1,$lng1) = (
                                             SELECT MIN (distance(lat,lng,$lat1,$lng1))
                                             FROM Node c_n
                                             WHERE c_n.nid = n1.nid)
AND distance(n2.lat,n2.lng,$lat2,$lng2) = (
                                             SELECT MIN (distance(lat,lng,$lat1,$lng1))
                                             FROM Node c_n
                                             WHERE c_n.nid = n2.nid)

(在这个猜想中,我无法测试这个,请原谅我,如果这不是确切的,但它应该是关闭的。我会在稍后检查。)