2017-01-05 12 views
1

ここで私は、後続のデータを計算した後、最小の距離だけを表示されます場所の間の距離を計算したいと思います。しかし、私は、次のようなデータに基づいて作成する方法を混乱しています:どのように緯度からの距離を計算し、最短距離を選択する

私wp_posts: data1

とここに私のwp_postmeta:

here

とここに私のコード:

<?php 
$latitude = "23.139422"; 
$longitude = "-82.382617"; 

mysql_query('SELECT (3959 * acos(cos(radians('.$latitude.')) * cos(radians(latitude)) * cos(radians(longitude) - radians('.$longitude.')) + sin(radians('.$latitude.')) 
    * sin(radians(latitude)))) 
    AS distance from wp_posts 
    HAVING distance <= 100 
    ORDER BY distance ASC' 
) 
私はIDで緯度と経度を取る方法

私は知らないpost_id

誰かがその私が欲しいもののような仕事をできるように私は私のコードでimporve必要なものを教えてきましたか?おかげで

圭 - これはあなたがメタから緯度と経度を取得する方法である

+2

[st \ _distanceを使用してmysqlの距離でユーザーを並べ替える]の可能な複製(http://stackoverflow.com/questions/28853778/sorting-users-by-distance-in-mysql-using-st-distance) – e4c5

答えて

1

を:私たちは(あなたの処方が動作していると仮定して)SQL文にこれを適用しようとした場合

SELECT wp_posts.ID, pm1.meta_value, pm2.meta_value 
FROM wp_posts 
    LEFT JOIN wp_postmeta AS pm1 
     ON pm1.post_id = wp_posts.ID 
      AND pm1.meta_key = 'latitude' 
    LEFT JOIN wp_postmeta AS pm2 
     ON pm2.post_id = wp_posts.ID 
      AND pm2.meta_key = 'longitude'; 

SELECT (3959 * acos(cos(radians('.$latitude.')) * cos(radians(pm1.meta_value)) 
    * cos(radians(pm2.meta_value) - radians('.$longitude.')) 
    + sin(radians('.$latitude.')) 
    * sin(radians(pm1.meta_value)))) AS distance 
FROM wp_posts 
    LEFT JOIN wp_postmeta AS pm1 
     ON pm1.post_id = wp_posts.ID 
      AND pm1.meta_key = 'latitude' 
    LEFT JOIN wp_postmeta AS pm2 
     ON pm2.post_id = wp_posts.ID 
      AND pm2.meta_key = 'longitude'    
HAVING distance <= 100 
ORDER BY distance ASC; 

これは複雑に見えるかもしれませんが、最初のものをもっと近く見るとそうではありません。異なるレコード(緯度はpm1、経度はpm2)を使用して、同じレコードのデータを同じテーブルから2回取り出す方法を理解するのに役立ちます。

希望します。

+0

'。 ' '.'は不要です。この式では、ヌル値は意味がないため、JOINを使用することもできます – Strawberry

関連する問題