我有一个网站,用户可以在其中查找其他用户。这是一个基本的搜索功能,但我希望用户的结果是基于位置的。所以也许他们会搜索“大卫”。该基本查询将是
SELECT *
FROM users
where fname = 'David' or
lname= 'David'
ORDER BY distance ASC
问题是必须首先在每个用户和搜索者之间计算距离。我怎样才能做到这一点?没有要求显示如何计算距离或任何东西,只是如何在逻辑上解决这个问题。
答案 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