我有一张桌子,里面有当地的企业坐标(纬度,经度)
我需要获取给定半径内的所有业务,为此,我使用一个查询来计算飞行距离

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个,那就变得有点棘手了。
在这种情况下,你可以做一个类似“如果距离看起来像这样:

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 < ?

关于php - SQL:动态扩展搜索条件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24556913/

10-11 03:09