Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/287.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 SQL:动态扩展搜索条件_Php_Mysql_Sql_Geolocation - Fatal编程技术网

Php SQL:动态扩展搜索条件

Php SQL:动态扩展搜索条件,php,mysql,sql,geolocation,Php,Mysql,Sql,Geolocation,我有一张包含本地企业的表格,坐标为lat,lon 我需要获取给定半径内的所有业务,为此,我使用一个查询来计算动态距离 select b.* from `businesses` as b where ( 1.609344 * 3956 * 2 * ASIN( SQRT( POWER(SIN((lat - b.lat) * pi()/180 / 2), 2) + COS(lat * pi()/180) * COS(b.lat * pi()/

我有一张包含本地企业的表格,坐标为lat,lon 我需要获取给定半径内的所有业务,为此,我使用一个查询来计算动态距离

select b.* from `businesses` as b
where
(
1.609344 * 3956 * 2 * ASIN(
    SQRT( 
            POWER(SIN((lat - b.lat) *  pi()/180 / 2), 2) +
            COS(lat * pi()/180) * COS(b.lat * pi()/180) * 
            POWER(SIN((lng -b.lng) * pi()/180 /-2), 2) 
        )
    )
) <= radius
现在我需要扩大半径,以防该地区的业务太少,
因此,假设在给定半径内,只有10家企业需要动态扩展半径,直到达到50,只需计算距离给定点的距离,并使用该距离进行排序,然后将结果数量限制为50

如果你想要50个以上的结果,如果在半径范围内有50个以上的结果,这会变得有点棘手

在这种情况下,您可以使用类似“if distance<?”这样的子句?或RowNum<50'。在MySQL中,创建行号的唯一方法是使用变量

这看起来像这样:

WITH t1 AS
(
    SELECT b.*,
    1.609344 * 3956 * 2 * ASIN(
                SQRT( 
                    POWER(SIN((lat - b.lat) *  pi()/180 / 2), 2) +
                    COS(lat * pi()/180) * COS(b.lat * pi()/180) * POWER(SIN((lng -b.lng) * pi()/180 / 2), 2) 
                )
            )
    ) AS distance
    FROM businesses as b
), t2 AS
(
     SELECT *, @rownum := @rownum + 1 AS row_num
     FROM t1, (SELECT @rownum := 0) r
     ORDER BY distance
)
SELECT * FROM t2
WHERE distance < ? OR row_num < ?

你们能不能把它们都扔掉,但若有超过50个的话,我需要把它们都看一遍。哦,我明白了。。。在SQLServer中,我可能会使用递归CTE来实现类似的功能,但我认为MySQL中没有类似的结构。在您的情况下,我可能会使用一个临时表创建一个存储过程,并用第一个结果填充它。如果小于50,则我将以递增的半径循环查询,直到有50,然后返回临时表。我没有提到我正在使用MySql,并且它不支持行号