1

我有一个网站,用户可以在其中查找其他用户。这是一个基本的搜索功能,但我希望用户的结果是基于位置的。所以也许他们搜索“大卫”。的基本查询是

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

问题是必须首先计算每个用户和搜索者之间的距离。我怎样才能做到这一点?不要求展示如何计算距离或任何东西,只是如何从逻辑上解决这个问题。

4

3 回答 3

2

编辑:问题是直接在您的选择语句中计算距离并根据此计算对结果进行排序。

因此,如果您将纬度/经度存储在数据库中,您应该能够执行以下操作:

$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 回答