0

我有那些桌子

Node (#id, route_id, lat, lng)

路线(#id)

我有四个输入值:$lat1、$lng1、$lat2、$lng2,分别代表 2 个 GPS 坐标 GPS1 和 GPS2。我还有一个添加到数据库的距离函数:距离(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 列进行排序,但我不知道该怎么做。

任何的想法 ?

4

1 回答 1

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)

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

于 2010-07-28T00:35:19.547 回答