2010-11-30 20 views
0

j'ai une table avec des emplacements GPS de chaînes de restaurants et souhaite retourner les adresses des restaurants les plus proches au point (A) dans un certain rayonSqlite sélectionner la valeur de fonction minimale de résultat groupé

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 

renvoie l'erreur

mauvaise utilisation de granulats: MIN()

Répondre

0

Lamak était un peu juste, mais ce que je fini par faire à la 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 

this helps quelqu'un d'autre

0

Je parie que vous appelez une fonction qui est distance($lat, $lon, lat, lon), ne vous?

Avez-vous essayé d'utiliser une soustraction simple entre $lat et lat et de lui faire retourner la valeur minimale en utilisant la fonction MIN? Le but de mon travail est d'utiliser un champ de table ou une opération de base comme une soustraction, je suppose. Cela peut être la cause de l'erreur rencontrée.

Avant toute chose, évitez d'utiliser * tout en utilisant les fonctions d'agrégation, indiquez les colonnes dont vous avez besoin dans votre requête. Peut-être que nous fournir des exemples de données pourrait nous aider à trouver un moyen de contourner pour vous aider à traverser.

1

Je pense que votre problème est que vous êtes seulement regroupés 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 SELECT qui ne se trouvent dans aucune 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 *).

Questions connexes