2010-10-30 7 views
1

Le problème que j'ai est d'aller chercher des données dans les tables suivantes où une route de bus contient 1 changement ou plus. Je suis encore relativement nouveau à SQL.MySQL - Obtenir des informations à partir de la base de données des itinéraires de bus

J'ai une base de données contenant 2 tables (bus_route et bus_stop). bus_route contient les colonnes suivantes:

itinéraire - le numéro du bus
run - la direction de l'autobus (1 ou 2)
séquence - la position de la butée le long de l'itinéraire
stop_code - code unique pour cet arrêt
stop_name
longitude
latitude

bus_stop contient les colonnes suivantes:

stop_code
stop_name
latitude
longitude
stop_area - 3 à 8 bus par zone d'arrêt

pour chaque bus il y a entre 20 et 70 lignes de bus_route en fonction du nombre d'arrêts et une ligne par butée dans arrêt de bus.

Je l'ai écrit SQL pour chercher les lignes où nous avons une route directe entre 2 emplacements:

SELECT distinct route 
from bus_route 
where 
SQRT(POW((69.1 * (latitude - {startLocationLatitude})) , 2) + 
POW((53 * (longitude - {startLocationLongitude})), 2)) < 0.3 
and route in (SELECT distinct route 
from bus_route 
where 
SQRT(POW((69.1 * (latitude - {endLocationLatitude})) , 2) + 
POW((53 * (longitude - {endLocationLongitude})), 2)) < 0.3) 

Il fonctionne bien en retour les lignes où le la bus_stop est à 0,3 miles de l'emplacement de début/fin.

J'ai également écrit le ci-dessous SQL pour trouver des itinéraires avec 1 changement où le 2ème bus part de la même arrêt que l'endroit où vous partiez le 1er bus:

select t1.route, t1.run, t1.sequence, t1.stop_code, t2.route, t2.run, t2.sequence 
from bus_route t1 
inner join bus_route t2 on (t2.stop_code=t1.stop_code) 
where t1.route in (SELECT distinct route 
from bus_route 
where 
SQRT(POW((69.1 * (latitude - {startLocationLatitude})) , 2) + 
POW((53 * (longitude - {startLocationLongitude})), 2)) < 0.3) 
and t2.route in (SELECT distinct route 
from bus_route 
where 
SQRT(POW((69.1 * (latitude - {endLocationLatitude})) , 2) + 
POW((53 * (longitude - {endLocationLongitude})), 2)) < 0.3)) 

Les deux déclarations fonctionnent bien mais je ne parviens pas à incorporer stop_area dans l'instruction pour trouver des routes avec 1 changement où le 2ème bus part d'un autre stop dans la même zone stop_.

Tout conseil sur les requêtes ci-dessus ou comment utiliser stop_area serait grandement apprécié.

Je dois aussi mentionner que ce qui suit est pas le mien (je l'ai trouvé en ligne):

SQRT(POW((69.1 * (latitude - {endLocationLatitude})) , 2) + 
POW((53 * (longitude - {endLocationLongitude})), 2)) < 0.3)) 

Répondre

0

Il y a une relation 1: 1 entre bus_route et bus_stop. Donc, pour aller de route1, à stop1, à tous matching arrêts dans la même zone, à toutes les routes correspondant à la même zone:

route1 -> stop1 => stop2 -> route2 

Une façon de faire qui serait en train de changer:

from bus_route t1 
inner join bus_route t2 on t2.stop_code = t1.stop_code 

Pour:

from bus_route t1 
inner join bus_stop s1 on s1.stop_code = t1.stop_code 
inner join bus_stop s2 on s2.stop_area = s1.stop_area 
inner join bus_route t2 on t2.stop_code = s2.stop_code 
+0

Merci beaucoup. Cela a bien fonctionné. En guise d'extension, y a-t-il un problème à faire ce qui suit: –

+0

de bus_route t1 #inner rejoindre bus_stop s2 sur la sous-chaîne (s2.stop_area, 0, 3) = sous-chaîne (s1.stop_area, 0, 3) jointure interne bus_stop s2 sur s2.stop_area = s1.stop_area jointure interne bus_route t2 sur t2.stop_code = s2.stop_code –

+0

@Ed Knight: Eh bien, avec sous-chaîne la position du premier caractère est un. Donc vous cherchez probablement 'substring (s2.stop_area, 1,3)'. Sinon, ça a l'air bien. – Andomar

Questions connexes