我有一张桌子上有餐馆连锁店的GPS位置

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()

有帮助吗?

解决方案 3

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 

希望这对别人有帮助

其他提示

我认为您的问题是您仅分组 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 *).

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

您是否尝试过使用简单的减法 $latlat 并使用 MIN 功能?

MIN我猜是与表字段或一些基本操作(例如减法)一起使用。这可能是遇到错误的原因。

首先,避免使用 * 在使用聚合功能时,请在查询中列出您需要的列。

也许向我们提供示例数据可能会帮助我们找到解决您的方法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top