Php 如何在PostgreSQL中根据给定的纬度和经度以及给定的距离查找记录
我用的是这个公式Php 如何在PostgreSQL中根据给定的纬度和经度以及给定的距离查找记录,php,laravel,postgresql,Php,Laravel,Postgresql,我用的是这个公式 SELECT id, ( 3959 * acos( cos( radians(14.685327) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(80.054889) ) + sin( radians(14.685327) ) * sin(radians(latitude)) ) ) AS distance FROM kr_user HAVING distance <
SELECT id, ( 3959 * acos( cos( radians(14.685327) ) * cos( radians( latitude ) )
* cos( radians( longitude ) - radians(80.054889) ) + sin( radians(14.685327) ) * sin(radians(latitude)) ) ) AS distance
FROM kr_user
HAVING distance < 50
ORDER BY distance
如何解决这个问题。或者对此提出任何其他建议。我使用的是laravel平台。我猜您的纬度和经度列是varchar类型,而不是14.685327类型的数字 因此,请尝试:
SELECT id, ( 3959 * acos( cos( radians(14.685327) ) * cos( radians( latitude::numeric ) )
* cos( radians( longitude::numeric ) - radians(80.054889) ) + sin( radians(14.685327) ) * sin(radians(latitude::numeric)) ) ) AS distance
FROM kr_user
HAVING distance < 50
ORDER BY distance
现在,正如您在评论中指出的,您不能对计算列进行过滤,我个人会使用横向连接来解决此问题:
SELECT id, t.distance
FROM kr_user
INNER JOIN LATERAL (
SELECT 3959 * acos(
cos( radians(14.685327) ) *
cos( radians( latitude::numeric ) ) *
cos( radians( longitude::numeric ) - radians(80.054889) ) +
sin( radians(14.685327) ) *
sin(radians(latitude::numeric))
) AS distance
WHERE latitude IS NOT NULL AND longitude IS NOT NULL
) t ON TRUE
WHERE t.distance < 50
ORDER BY t.distance
现在having子句中不存在给定列距离的错误。表中没有距离列。我必须找到动态距离。现在出现新错误:numeric类型的输入语法无效:NULL上下文:parallel worker在纬度为NULL或经度为NULL的情况下,从kr_用户选择COUNT*返回什么?它返回COUNT 430765
SELECT id, t.distance
FROM kr_user
INNER JOIN LATERAL (
SELECT 3959 * acos(
cos( radians(14.685327) ) *
cos( radians( latitude::numeric ) ) *
cos( radians( longitude::numeric ) - radians(80.054889) ) +
sin( radians(14.685327) ) *
sin(radians(latitude::numeric))
) AS distance
WHERE latitude IS NOT NULL AND longitude IS NOT NULL
) t ON TRUE
WHERE t.distance < 50
ORDER BY t.distance