sqlite выберите минимальное значение функции сгруппированного результата - PullRequest
0 голосов
/ 30 ноября 2010

У меня есть таблица с местоположениями 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 ()

Ответы [ 3 ]

1 голос
/ 30 ноября 2010

Я думаю, что ваша проблема в том, что вы группируете только по 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 *).

0 голосов
/ 02 декабря 2010

Ламак был несколько прав, но это то, что я закончил вместо этого

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 голосов
/ 30 ноября 2010

Могу поспорить, что вы вызываете функцию, которая distance($lat, $lon, lat, lon), не так ли?

Вы пытались использовать простое вычитание между $lat и lat и возвращали минимумзначение с использованием функции MIN?

MIN предназначено для использования с полем таблицы или какой-либо базовой операции, такой как вычитание, я полагаю.Это может быть причиной обнаруженной ошибки.

Прежде всего, избегайте использования * при использовании функций агрегирования, перечислите столбцы, которые вам нужны в вашем запросе.

Возможно, предоставите нам образецДанные могут помочь нам найти способ помочь вам.

...