我有一张餐馆连锁店的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()
答案 0 :(得分: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 *
)。
答案 1 :(得分:0)
我打赌你正在调用distance($lat, $lon, lat, lon)
的函数,不是吗?
您是否尝试在$lat
和lat
之间使用简单的减法,并使用MIN
函数返回最小值?
MIN
的目的是用于表字段或一些基本操作,例如减法,我想。这可能是遇到错误的原因。
最重要的是,避免在使用聚合函数时使用*
,列出查询中所需的列。
或许向我们提供样本数据可能有助于我们找到解决方法。
答案 2 :(得分: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
希望这有助于其他人