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

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top