2010-11-30 73 views
0

的最小函数值我有一个表与餐馆连锁店的GPS位置,并想返回最近的餐馆的地址,以点(A)一定半径SQLite的选择分组结果

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(

回答

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 

希望这可以帮助别人

0

我敢打赌,你调用的函数,而distance($lat, $lon, lat, lon),不是吗?

您是否尝试过使用$latlat之间的简单减法,并使用MIN函数返回最小值?

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

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

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

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 * )。