2017-05-08 57 views
1

我使用WordPress自定義字段加入,它基本上有一個meta_key列和wp_postmetameta_value欄裏面我是用存儲meta_keys「經度」和'緯度'meta_values說,24.3和76.2對於一個類型爲「健身房」的post_id需要在SQL查詢中執行數學運算與多對同桌

現在我需要從Php查詢數據庫,從10km半徑範圍內的用戶位置查找附近的健身房。我使用下面的查詢:

    SELECT 
       pm1.meta_value AS longitude, 
       pm2.meta_value AS latitude, 
       ACOS(SIN(RADIANS(pm2.meta_value)) * SIN(RADIANS($user_lat)) + COS(RADIANS(pm2.meta_value)) 
       * COS(RADIANS($user_lat)) * COS(RADIANS(pm1.meta_value) - RADIANS($user_lng))) * $earth_radius AS distance 

       FROM `wp_postmeta` pm1 
        INNER JOIN `wp_postmeta` pm2 ON pm1.post_id = pm2.post_id 

       WHERE 
        pm1.meta_key = 'longitude' 
        AND pm2.meta_key = 'latitude' 
        AND ACOS(SIN(RADIANS(pm2.meta_value)) * SIN(RADIANS($user_lat)) + COS(RADIANS(pm2.meta_value)) 
       * COS(RADIANS($user_lat)) * COS(RADIANS(pm1.meta_value) - RADIANS($user_lng))) * $earth_radius < 10 

其中$user_lat$user_lng是PHP變量表示用戶位置。這不起作用。語法似乎是正確的,但計算的距離不是。我從radius search with google maps and mysql得到了靈感

我在做什麼錯?

更新:上述代碼有效。我犯了一個非常愚蠢的錯誤。以上代碼對於面臨相同問題的人來說是一個很好的資源,其中longitudelatitude字段沒有明確定義,例如在默認的WordPress自定義字段表格佈局中。

+0

mysql或者SQL服務器? – GurV

+0

這是一個mysql服務器,對不起,錯了標記 –

+0

我不認爲6371是公里。你是否得到太多或兩行? –

回答

0

難道你不能只計算每個健身房和用戶位置之間的距離,並返回距離< = 10km的距離嗎?

例如:

用戶座標=(7,2)

Gym1座標=(2,4)
Gym2座標=(10,3)
...

距離1 = SQRT((7-2)^ 2 +(2-4)^ 2)
距離2 = SQRT((7-10)^ 2 +(2-3)^ 2)
...

+0

這就是我想要做的那裏....但查詢不起作用 –

+0

順便說一句,該公式不適用於經度和latityudes ...它比這更復雜... –

+0

是啊,我剛剛意識到距離公式因地球曲率而不同。也許你找到的公式不正確。 – Marko