Php SQL:动态扩展搜索条件
我有一张包含本地企业的表格,坐标为lat,lon 我需要获取给定半径内的所有业务,为此,我使用一个查询来计算动态距离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()/
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,并且它不支持行号