0

私はそれらのテーブルを持っています

Node (#id, route_id, lat, lng)

ルート(#id)

$lat1、$lng1、$lat2、$lng2 の 4 つの入力値があり、これらは 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

そして、n1.lat、n1.lng、d1列の場合はd1で、n2.lat、n2.lng、d2列の場合は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 に答える