使用列值作为列名mysql
问题描述:
我正在尝试获取5 KM半径内的所有用户。这里是我的表结构使用列值作为列名mysql
id| location
-------------
1| 26.851791,75.781810
2| 26.860729,75.7633127
3| 34.057811,-84.239125
我编写一个查询依据lat
和long
SELECT SUBSTRING_INDEX(location, ',', 1) AS lat, SUBSTRING_INDEX(location, ',', -1) AS lng
FROM `users_test`
LIMIT 0 , 30
哪个做工精细分离的位置,我得到的结果如下
然后根据以下博客编写查询以获取所有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 - 在 '字段列表' 未知列 '纬度'
谁能告诉我在哪里,我错了。
答
您不能在相同的SELECT
子句中引用列别名。您需要将其移动到子查询中。而且您不能在SELECT
的WHERE
子句中引用别名,则需要使用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
我强烈建议你修正你的表格设计,把纬度和经度放在他们自己的列中,而不是每次都在逗号分割。
你不能在字段列表中使用别名 – splash58