0

経度と緯度で最も近い点を見つけるために実行しようとしています。正常に機能するのは、データベースに個別の値が保存されていることですが、パイプで接続された単一の文字列があり、部分文字列インデックスで分割できます。ただし、選択クエリでこれらの関数を組み合わせようとすると、喜びが得られません。

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(longlat, '|', 1), '|', -1) as 'lat',
SUBSTRING_INDEX(SUBSTRING_INDEX(longlat, '|', 2), '|', -1) as 'lng',
title,
( 6371 * acos( cos( radians(51.527351) ) * cos( radians( 'lat') ) * cos( radians( 'lng' ) - radians(0.765544) ) + sin( radians(51.527351) ) * sin( radians( 'lat' ) ) ) ) AS distance 
FROM locations HAVING distance < 500
ORDER BY distance
LIMIT 0 , 20

誰でも光を当てることができますか?

4

2 に答える 2

1

radians( 'lat')

クエリのこの部分では'lat'、列名などではなく文字列です。その文字列を に渡すとradians、数値に変換されます。この場合はゼロに変換されます。つまり、0 をラジアンに変換しています。

ある列を別の列の値の計算への入力として使用することはできません。式を繰り返すか、次のようなサブクエリを使用する必要があります。

SELECT lat, lng, title,
  (6371 * acos(cos(radians(51.527351)) *
   cos(radians(lat)) * cos(radians(lng) - radians(0.765544)) +
   sin(radians(51.527351)) * sin(radians(lat)))
  ) AS distance
FROM
  (SELECT title,
     SUBSTRING_INDEX(SUBSTRING_INDEX(longlat, '|', 1), '|', -1) + 0 as lat,
     SUBSTRING_INDEX(SUBSTRING_INDEX(longlat, '|', 2), '|', -1) + 0 as lng
   FROM locations
  ) AS sub
HAVING distance < 500
ORDER BY distance
LIMIT 0 , 20
于 2012-10-04T12:29:31.597 に答える
0

これがクエリを繰り返す私の解決策です。さまざまなソリューションのベンチマークをテストする機会はありませんでしたが、サブクエリのソリューションはより快適です

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(longlat, '|', 1), '|', -1) as 'latitude',
       SUBSTRING_INDEX(SUBSTRING_INDEX(longlat, '|', 2), '|', -1) as 'longitude',
(
  3959 * acos(
    cos(radians({MYLAT})) * cos(radians(SUBSTRING_INDEX(SUBSTRING_INDEX(longlat, '|', 1), '|', -1)))
    * cos(radians(SUBSTRING_INDEX(SUBSTRING_INDEX(longlat, '|', 2), '|', -1))) - radians({MYLONG}) + sin(radians({MYLAT})) 
    * sin( radians(SUBSTRING_INDEX(SUBSTRING_INDEX(longlat, '|', 1), '|', -1)))
  )
)
AS distance,
title

FROM locations
ORDER BY distance
LIMIT 0 , 20

結局のところ、私はこの方程式をどこでも使用するつもりなので、それを釘付けにしてうれしいです:)

私は地球の半径として平均 3959 を使用していますが、世界のさまざまな場所にある種の地域緯度を使用する方がよいのではないかと考えています。

于 2012-10-08T14:19:34.313 に答える