select sqlite valeur de fonction minimale de résultat groupé
Question
I ai une table avec des emplacements de GPS de chaînes de restaurants et souhaite retourner les adresses des restaurants les plus proches de point (A) dans un certain rayon
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
Erreur de retour
mauvaise utilisation de l'agrégat: MIN ()
La solution 3
Lamak était un peu juste, mais ce que je fini par faire place
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
espère que cela aide quelqu'un d'autre
Autres conseils
Je pense que votre problème est que vous ne regroupez par restaurant_id
. Lorsque vous utilisez une fonction d'agrégation comme MIN, MAX, SUM, AVG
, etc, vous devez inclure chaque colonne dans l'instruction de SELECT
qui ne sont pas dans une fonction d'agrégation. Dans ce cas, vous avez deux options, soit dans le SELECT
vous ne mettez restaurant_id
comme suit:
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
Ou vous mettez toutes les autres colonnes inclus dans le « * » sur le regroupement (parce que vous ne pouvez pas utiliser GROUP BY *
).
Je parie que vous appelez une fonction qui est distance($lat, $lon, lat, lon)
, ne pas vous?
Avez-vous essayé d'utiliser une simple soustraction entre $lat
et lat
et avoir le retour de la valeur minimale en utilisant la fonction MIN
?
Le but de MIN
est pour une utilisation avec un champ de table ou d'une opération de base, comme une soustraction, je suppose. Cela pourrait être la cause de l'erreur rencontrée.
Jusqu'à tout, évitez d'utiliser *
tout en utilisant les fonctions d'agrégation, liste les colonnes dont vous avez besoin dans votre requête.
Peut-être nous fournir des exemples de données pourrait nous aider à trouver un moyen de contourner pour vous travailler à travers.