[英]How to get Subquery nearest distance?
我有一個查詢來獲取基於數據庫表中的緯度和經度計算后的距離。
每個用戶都有自己的緯度和經度,我正在嘗試獲取離用戶位置最近的中心名稱。 但是,當有2個位置離用戶很近時,我的查詢將出錯,我如何獲取可以在子查詢中返回的最近的中心名稱?
以下是我的PHP查詢:
SELECT
t1.id, t2.name AS na_name, t3.name AS centre_name, t1.login, t1.login_lat, t1.login_long,
(SELECT centre_name
from centre_location where
(3956 * 2 * ASIN(SQRT( POWER(SIN(( t1.login_lat - centre_lat) * pi()/180 / 2), 2) +COS( t1.login_lat * pi()/180) * COS(centre_lat * pi()/180) * POWER(SIN(( t1.login_long - centre_long) * pi()/180 / 2), 2) ))) <= 0.18
) AS LOGIN_LOCATION, t1.login_location_accuracy,
t1.logout, t1.logout_lat, t1.logout_long, (SELECT centre_name
from centre_location where
(3956 * 2 * ASIN(SQRT( POWER(SIN(( t1.logout_lat - centre_lat) * pi()/180 / 2), 2) +COS( t1.logout_lat * pi()/180) * COS(centre_lat * pi()/180) * POWER(SIN(( t1.logout_long - centre_long) * pi()/180 / 2), 2) ))) <= 0.18
) AS LOGOUT_LOCATION, t1.logout_location_accuracy, t1.attendance_device_type , t1.remark
FROM attendance t1
left join user t2 on t1.user_id = t2.id
left join centre t3 on t1.centre_id = t3.id
where t1.id = 10130
我確實嘗試使用ORDER BY和LIMIT 1,但結果仍然不正確。 請參考以下內容:
SELECT
t1.id, t2.name AS na_name, t3.name AS centre_name, t1.login, t1.login_lat, t1.login_long,
(SELECT centre_name
from centre_location where
(3956 * 2 * ASIN(SQRT( POWER(SIN(( t1.login_lat - centre_lat) * pi()/180 / 2), 2) +COS( t1.login_lat * pi()/180) * COS(centre_lat * pi()/180) * POWER(SIN(( t1.login_long - centre_long) * pi()/180 / 2), 2) ))) <= 0.18
ORDER BY (3956 * 2 * ASIN(SQRT( POWER(SIN(( t1.login_lat - centre_lat) * pi()/180 / 2), 2) +COS( t1.login_lat * pi()/180) * COS(centre_lat * pi()/180) * POWER(SIN(( t1.login_long - centre_long) * pi()/180 / 2), 2) ))) <= 0.18 DESC LIMIT 1
) AS LOGIN_LOCATION, t1.login_location_accuracy,
t1.logout, t1.logout_lat, t1.logout_long, (SELECT centre_name
from centre_location where
(3956 * 2 * ASIN(SQRT( POWER(SIN(( t1.logout_lat - centre_lat) * pi()/180 / 2), 2) +COS( t1.logout_lat * pi()/180) * COS(centre_lat * pi()/180) * POWER(SIN(( t1.logout_long - centre_long) * pi()/180 / 2), 2) ))) <= 0.18
ORDER BY (3956 * 2 * ASIN(SQRT( POWER(SIN(( t1.logout_lat - centre_lat) * pi()/180 / 2), 2) +COS( t1.logout_lat * pi()/180) * COS(centre_lat * pi()/180) * POWER(SIN(( t1.logout_long - centre_long) * pi()/180 / 2), 2) ))) <= 0.18 DESC LIMIT 1
) AS LOGOUT_LOCATION, t1.logout_location_accuracy, t1.attendance_device_type , t1.remark
FROM attendance t1
left join user t2 on t1.user_id = t2.id
left join centre t3 on t1.centre_id = t3.id
where t1.id = 10130
center_name應該只返回1的值,以便我可以顯示/導出到想要的結果,但是有時center_name的返回值多於1行,如何獲得最接近的return值?
您的ORDER BY子句如下:
ORDER BY (3956 * 2 * ASIN(SQRT( POWER(SIN(( t1.login_lat - centre_lat) * pi()/180 / 2), 2) +COS( t1.login_lat * pi()/180) * COS(centre_lat * pi()/180) * POWER(SIN(( t1.login_long - centre_long) * pi()/180 / 2), 2) ))) <= 0.18 DESC LIMIT 1
簡而言之:
ORDER BY (<distance calculation>) <= 0.18 DESC LIMIT 1
雖然應該
ORDER BY (<distance calculation>) LIMIT 1
您應該刪除<= 0.18
。 您可能還需要ASC
(最短距離在前)而不是DESC
(最長距離在前)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.