Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在PostgreSQL中根据给定的纬度和经度以及给定的距离查找记录_Php_Laravel_Postgresql - Fatal编程技术网

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