在我的网站上,我试图获取附近的位置。
我尝试使用Haversine公式来实现这一点。
我正在使用以下查询来获取25公里半径内的所有位置。
SELECT id, ( 6371 * acos( cos( radians(51.8391) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(4.6265) ) + sin( radians(51.8391) ) * sin( radians( lat ) ) ) ) AS distance
FROM shops
HAVING distance < 25
ORDER BY name asc
然而,我认为一些函数可能仅适用于MySQL,因为我得到以下错误:
警告:PDOStatement :: execute() [pdostatement.execute]:SQLSTATE [42883]:未定义的函数:7 ERROR:函数radians(text)不存在LINE 1:... id,(6371 * acos(cos(radians(51.8391))* cos(radians(l ... ^ HINT:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。在...
或者可能与我必须更改查询中的文本
lat
有关。但我不知道应该是什么。51.8391和4.6265是我“起点”的经度和纬度。
非常感谢任何帮助,因为我不知道该怎么改变:-)
编辑
看起来问题出在我尝试做的地方:
radians(lat)。
lat是我的表中的一列。
当我尝试使用hakre建议的rad()
时,错误会更改为: function rad(numeric)不存在
编辑2
现在我们有所进展。
这些列的数据类型确实被设置为文本(如mu is too short所建议的)。
我已将其更改为双精度。
然而,现在我遇到了另一个错误:
警告:PDOStatement::execute() [pdostatement.execute]:SQLSTATE[42703]:未定义的列:7 ERROR:列“distance”不存在 LINE 1:...adians( lat ) ) ) ) AS distance FROM shops HAVING distance <... ^ in ...
但我认为我在选择中创建了别名。有什么想法吗?
如果你们认为这应该放在另一个问题中,请让我知道,我会关闭这个问题。