2015-09-04 140 views
2

我正在尝试获取5 KM半径内的所有用户。这里是我的表结构使用列值作为列名mysql

id| location 
------------- 
1| 26.851791,75.781810 
2| 26.860729,75.7633127 
3| 34.057811,-84.239125 

我编写一个查询依据latlong

SELECT SUBSTRING_INDEX(location, ',', 1) AS lat, SUBSTRING_INDEX(location, ',', -1) AS lng 
FROM `users_test` 
LIMIT 0 , 30 

哪个做工精细分离的位置,我得到的结果如下

enter image description here

然后根据以下博客编写查询以获取所有5KM Radius用户。

https://www.marketingtechblog.com/calculate-distance/

SELECT *,SUBSTRING_INDEX(location, ',', 1) AS lat, SUBSTRING_INDEX(location, ',', -1) AS lng,(((acos(sin(("26.851791"*pi()/180)) * sin((`lat`*pi()/180))+cos(("26.851791"*pi()/180)) * cos((`lat`*pi()/180)) * cos((("75.781810"- `lng`)*pi()/180))))*180/pi())*60*1.1515*1.609344) as distance 
FROM `users_test` 
WHERE distance >= "5" 

,但我得到下面的错误。

#1054 - 在 '字段列表' 未知列 '纬度'

谁能告诉我在哪里,我错了。

+0

你不能在字段列表中使用别名 – splash58

回答

4

您不能在相同的SELECT子句中引用列别名。您需要将其移动到子查询中。而且您不能在SELECTWHERE子句中引用别名,则需要使用HAVING

SELECT *, (((acos(sin(("26.851791"*pi()/180)) * sin((`lat`*pi()/180))+cos(("26.851791"*pi()/180)) * cos((`lat`*pi()/180)) * cos((("75.781810"- `lng`)*pi()/180))))*180/pi())*60*1.1515*1.609344) as distance 
FROM (SELECT *, 
     SUBSTRING_INDEX(location, ',', 1) AS lat, 
     SUBSTRING_INDEX(location, ',', -1) AS lng 
     FROM users_test) x 
HAVING distance > 5 

我强烈建议你修正你的表格设计,把纬度和经度放在他们自己的列中,而不是每次都在逗号分割。

+0

获取关注错误#1248 - 每个派生表必须具有自己的别名 – urfusion

+0

固定。我给了子查询一个别名。 – Barmar

+0

工作像魅力!谢谢 – urfusion