1

ユーザーが他のユーザーを検索できる Web サイトがあります。これは基本的な検索機能ですが、ユーザーの結果を位置情報に基づいて表示したいと考えています。だから多分彼らは「デビッド」を検索します。の基本的なクエリは次のようになります。

SELECT * 
FROM   users 
where  fname = 'David' or 
       lname= 'David' 
ORDER BY distance ASC

問題は、最初に各ユーザーと検索者の間の距離を計算する必要があることです。これどうやってするの?距離などを計算する方法を示すことを求めるのではなく、この問題を論理的に解決する方法だけを示します。

4

3 に答える 3

2

編集: select ステートメントで距離を直接計算し、この計算に基づいて結果を並べ替えることが重要です。

したがって、緯度/経度をデータベースに保存した場合は、次のようなことができるはずです。

$lat = {CURRENT_USER_LATITUDE};
$long = {CURRENT_USER_LONGITUDE};
SELECT users.*,
6371 * 2 * ASIN(SQRT( POWER(SIN(($lat - ABS(users.latitude)) * pi()/180 / 2), 2) + COS($lat * pi()/180 ) * COS( ABS(users.latitude) * pi() / 180 ) * POWER(SIN(($long - users.longitude)*pi()/180 / 2),2))) AS distance
FROM users
ORDER BY distance

また、MySQL で地理データ型を使用している場合は、クエリがはるかに単純になる可能性があります。

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

次のような計算フィールドを使用している場合

select
    someColumn,
    abs(someValue-someValue2)
from 
    myTable

abs()そして、次のように order by 句に追加するために必要な最小値で並べ替える必要があります。

select
    someColumn,
    abs(someValue-someValue2)
from 
    myTable
order by
    abs(someValue-someValue2) asc

または、次の構文を使用できます。

select
    someColumn,
    abs(someValue-someValue2)
from 
    myTable
order by
    2 asc
于 2012-08-19T14:11:28.003 に答える
0

次のようなことができます:

SELECT users.*, <distance calculation> AS distance
FROM users
WHERE fname = 'David' or
      lname = 'David'
ORDER BY distance ASC
于 2012-08-19T14:09:44.367 に答える