2012-03-13 24 views
5

Ho cercato di scrivere una query per un sistema di trasporto pubblico che produrrà un elenco di percorsi quando inserisco i numeri di stop di origine e destinazione.Query MySQL nidificate

Qui è la mia tabella di MySQL:

mysql> desc route_timings; 
+----------------+---------+------+-----+---------+----------------+ 
| Field   | Type | Null | Key | Default | Extra   | 
+----------------+---------+------+-----+---------+----------------+ 
| ID    | int(11) | NO | PRI | NULL | auto_increment | 
| route_number | int(11) | NO |  | NULL |    | 
| stop_number | int(11) | NO |  | NULL |    | 
| arrival_time | time | YES |  | NULL |    | 
| departure_time | time | YES |  | NULL |    | 
+----------------+---------+------+-----+---------+----------------+ 
5 rows in set (0.00 sec) 

Qui ci sono valori di esempio:

mysql> select * from route_timings; 
+----+--------------+-------------+--------------+----------------+ 
| ID | route_number | stop_number | arrival_time | departure_time | 
+----+--------------+-------------+--------------+----------------+ 
| 1 |   54 |   1 | 10:00:00  | 10:05:00  | 
| 2 |   54 |   2 | 11:00:00  | 11:05:00  | 
| 3 |   54 |   3 | 12:00:00  | 12:05:00  | 
| 4 |   55 |   3 | 13:00:00  | 13:05:00  | 
| 5 |   55 |   4 | 14:00:00  | 14:05:00  | 
| 6 |   55 |   5 | 15:00:00  | 15:05:00  | 
| 7 |   60 |   3 | 10:00:00  | 10:05:00  | 
| 8 |   60 |   2 | 11:00:00  | 11:05:00  | 
| 9 |   60 |   1 | 12:00:00  | 12:05:00  | 
+----+--------------+-------------+--------------+----------------+ 
9 rows in set (0.01 sec) 

la mia domanda è: se voglio elencare i route_number di che dovrebbe contenere stop_number 1 e stop_number 3, I scriverebbe una query simile a questa:

SELECT DISTINCT `route_number` FROM `route_timings` WHERE `route_number` IN (
    SELECT `route_number` FROM `route_timings` WHERE `stop_number`=1 
) AND `route_number` IN (
    SELECT `route_number` FROM `route_timings` WHERE `stop_number`=3 
); 

Tuttavia, la query precedente restituirà solo il numero di percorso che contiene le due fermate e non le rotte in cui la fermata di origine (1) sarebbe arrivata prima della sosta di destinazione (3).

La query restituirebbe il seguente:

+--------------+ 
| route_number | 
+--------------+ 
|   54 | 
|   60 | 
+--------------+ 

Il route_number 60 non parte da 1 e andare a 3, ma invece parte da 3 e va a 1. Qualcuno può aiutarmi aggiungere che punta al eseguire una query in modo che la query restituisca solo i route_numbers in cui l'orario_arrivo per lo stop numero 1 è inferiore al orario_arrivo per lo stop numero 3.

Grazie in anticipo. -Shain

risposta

1

ne dite qualcosa di simile:

select fromStop.RouteNumber 
from routeTimings fromStop 
    inner join routeTimings toStop on toStop.RouteNumber = fromStop.RouteNumber and toStop.StopNumber = 3 and toStop.ArrivalTime > fromStop.DepartureTime 
where fromStop.StopNumber = 1 

Nota questo sta usando la sintassi SQL server e nomi adeguato al convenzione a cui sono abituato ma il principio dovrebbe essere chiaro

+1

Questo era quello che stavo cercando. Grazie mille. –

0

Usa:

SELECT DISTINCT `route_number` FROM `route_timings` WHERE `stop_number` IN (1,3) 

Nota: perché DEPARTURE_TIME è> di arrival_time ??

+0

Penso che sia perché il trasporto arriva al nodo poi parte subito dopo – Tung

+0

L'orario_arrivo è l'ora in cui l'autobus arriva alla fermata dell'autobus e orario_data_ora è il momento in cui il l'autobus lascia la fermata dell'autobus dopo aver raccolto i passeggeri. –

+0

@Dax, la query suggerita non garantisce che entrambe le fermate 1 e 2 vengano visualizzate nel percorso. Restituirà percorsi che contengono uno qualsiasi dei due. + -------------- + | route_number | + -------------- + | 54 | | 55 | | 60 | + -------------- + –

1
SELECT DISTINCT `route_number` R1 FROM R1.`route_timings` WHERE R1.`stop_number` =3 AND R1.`route_number` IN (
SELECT `route_number` R2 FROM `route_timings` WHERE R2.`stop_number`=1 AND R2.`arrival_time` > R1.`arrival_time` 
); 

non posso provarlo in questo momento, ma spero che la sintassi è corretta. Quello che ho fatto è selezionare i percorsi che passano attraverso 3 e poi ho controllato se si fermano a 1 in un secondo momento. Di solito lavoro con SQLite che consente di rinominare le tabelle per le mietitrebbiatrici querys come ho fatto in SELEZIONATE route_number R2

+0

Non sono sicuro che sia possibile farlo in MySQL perché restituisce il seguente errore 'ERRORE 1146 (42S02): Tabella 'R1.route_timings' non 'esisto'. –

+0

Ho appena scoperto che funziona se si eliminano tutte le virgolette – Erpheus