SQLite: поиск минимальных значений функции - PullRequest
0 голосов
/ 28 июля 2010

У меня есть эти таблицы

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, но я не знаю, как это сделать.

Есть идеи?

1 Ответ

1 голос
/ 28 июля 2010

Вам необходимо выполнить коррелированный запрос:

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)

(По этой гипотезе я не могу проверить это, пожалуйста, прости меня, если это не точно, но это должно быть близко. Я проверюоб этом позже.)

...