簡體   English   中英

如何獲得子查詢最近的距離?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM