0

我有一张桌子,上面有连锁餐厅的 gps 位置,想返回在一定半径内最接近点 (A) 的餐厅的地址

SELECT *
    , MIN(distance($lat, $lon, lat, lon)) as miles 
FROM all_restaurants 
WHERE lat between $lat1 and $lat2 
    AND lon between $lon1 and $lon2 
    AND miles < $miles 
GROUP BY restaurant_id 
ORDER BY miles ASC
    , company_name ASC 
LIMIT 500

返回错误

滥用聚合:MIN()

4

3 回答 3

1

我认为您的问题是您仅按restaurant_id. 当您将聚合函数用作MIN, MAX, SUM, AVG等时,您需要在SELECT语句中包含不在任何聚合函数中的每一列。在这种情况下,您有两个选项,或者SELECT您只restaurant_id输入以下内容:

SELECT restaurant_id 
        , MIN(distance($lat, $lon, lat, lon)) as miles 
    FROM all_restaurants 
    WHERE lat between $lat1 and $lat2 
        AND lon between $lon1 and $lon2 
        AND miles < $miles 
    GROUP BY restaurant_id 
    ORDER BY miles ASC
        , company_name ASC 
    LIMIT 500

或者您将“*”中包含的所有其他列放在分组中(因为您不能使用GROUP BY *)。

于 2010-11-30T17:55:40.950 回答
0

我打赌你正在调用一个函数distance($lat, $lon, lat, lon),不是吗?

您是否尝试过在和之间使用简单的减法$lat并让它使用该函数lat返回最小值?MIN

MIN的目的是用于表字段或一些基本操作,如减法,我猜。这可能是遇到错误的原因。

最重要的是,避免*在使用聚合函数时使用,列出查询中需要的列。

也许向我们提供样本数据可能会帮助我们找到解决问题的方法。

于 2010-11-30T17:48:13.727 回答
0

Lamak 有点正确,但这就是我最终所做的

SELECT *, distance('+lat+','+lon+', lat, lon) as minmiles
FROM all_restaurants 
WHERE restaurant_id || minmiles IN 
( 
    SELECT restaurant_id || MIN(miles) as fewmiles 
    FROM ( 
        SELECT restaurant_id, distance('+lat+','+lon+', lat, lon) as miles 
        FROM restaurant_master_combined 
        WHERE lat BETWEEN $lat AND $lat2 AND lon BETWEEN $lon1 AND $lon2 AND miles < $miles
    ) 
    GROUP BY restaurant_id 
)
ORDER BY ROUND(minmiles) ASC, company_name ASC 

希望这对其他人有帮助

于 2010-12-02T14:41:02.210 回答