使用MySQL命令

时间:2012-08-19 13:58:29

标签: php mysql

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

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

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

3 个答案:

答案 0 :(得分: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中使用地理数据类型,那么您可能会有一个更简单的查询。

答案 1 :(得分: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

答案 2 :(得分:0)

您可以执行以下操作:

SELECT users.*, <distance calculation> AS distance
FROM users
WHERE fname = 'David' or
      lname = 'David'
ORDER BY distance ASC