2010-07-27 2 views
0

Je les tables

Node (#id, route_id, lat, lng) 

Route de fonction (#id) représente 2 coordonnées GPS GPS1 et GPS2. J'ai aussi une fonction de distance que j'ai ajouté à la base de données: distance (lat1, lng1, lat2, lng2)

Ce que je cherche est la requête qui me donnera le point le plus proche de GPS1, et le point le plus proche au GPS2 pour chaque itinéraire. Je pense que oui, il devrait commencer comme:

SELECT r.id, n1.lat, n1.lng, n2.lat, n2.lng 
FROM Node n1, Node n2 
JOIN Route r ON n1.route_id = r.id AND n2.route_id = r.id 

et moi avons essayé d'ajouter

WHERE distance(n1.lat,n1.lng,$lat1,$lng1) = MIN (distance(n1.lat,n1.lng,$lat1,$lng1)) 
AND distance(n2.lat,n2.lng,$lat2,$lng2) = MIN (distance(n2.lat,n2.lng,$lat2,$lng2)) 

Mais il jette cette erreur:

"misuse of aggregate function MIN()" 

Je pensais aussi que je pouvais utiliser

SELECT r.id, n1.lat, n1.lng, n2.lat, n2.lng, distance(n1.lat,n1.lng,$lat1,$lng1) AS d1, distance(n2.lat,n2.lng,$lat2,$lng2) AS d2 
FROM Node n1, Node n2 
JOIN Route r ON n1.route_id = r.id AND n2.route_id = r.id 
GROUP BY r.id 

Et pour le trier par d1 pour les colonnes n1.lat, n1.lng, d1 et par d2 pour les colonnes n2.lat, n2.lng, d2 mais je ne sais pas comment faire ça.

Toute idée?

Répondre

1

Vous devez effectuer une requête en corrélation.

SELECT r.id, n1.lat, n1.lng, n2.lat, n2.lng 
FROM Node n1, Node n2 
JOIN Route r ON n1.route_id = r.id AND n2.route_id = r.id 
WHERE distance(n1.lat,n1.lng,$lat1,$lng1) = (
              SELECT MIN (distance(lat,lng,$lat1,$lng1)) 
              FROM Node c_n 
              WHERE c_n.nid = n1.nid) 
AND distance(n2.lat,n2.lng,$lat2,$lng2) = (
              SELECT MIN (distance(lat,lng,$lat1,$lng1)) 
              FROM Node c_n 
              WHERE c_n.nid = n2.nid) 

(A cette conjecture, je ne peux pas tester cela, s'il vous plaît pardonnez-moi si ce n'est pas exact, mais il devrait être proche je vais vérifier sur plus tard.)

+0

Hey c'est cool! Je ne savais pas que SQLite pouvait faire ça. Et comme je suis si méchant avec eux, je n'ai pas osé essayer. Je vais l'implémenter et vous laisser savoir si cela fonctionne – Julien

+0

Cela fonctionne! Vous êtes l'homme :) – Julien

Questions connexes