2012-03-13 21 views
5

He intentado escribir una consulta para un sistema de transporte público que generará una lista de rutas cuando ingrese los números de detención de origen y destino.Consultas MySQL anidadas

Aquí está mi tabla de 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) 

Éstos son valores de muestra:

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) 

Mi pregunta es: si quiero enumerar los años ROUTE_NUMBER que contendrían stop_number 1 y stop_number 3, I escribiría una consulta similar a esta:

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

Sin embargo, la consulta anterior solo devolvería los route_numbers que contienen las dos paradas y no las rutas donde la fuente de detención (1) llegaría antes de la parada de destino (3).

La consulta devolvería el siguiente:

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

El ROUTE_NUMBER 60 no se inicia desde 1 e ir a 3, pero en cambio se inicia a partir del 3 y se dirige a 1. Puede alguien por favor me ayude a añadir que poco a la consulta para que la consulta muestre solo los números de ruta donde la hora de llegada para el número de parada 1 es menor que la hora de llegada para el número de parada 3.

Gracias de antemano. -Shain

Respuesta

1

¿Qué tal algo como:

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 esto es usar la sintaxis del servidor SQL y nombres ajusta a la convención Estoy acostumbrado, pero el principio debe ser claro

+1

Eso era lo que estaba buscando. Muchas gracias. –

0

Uso:

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

Nota: ¿por qué es departure_time> arrival_time que ??

+0

Creo que es porque el transporte llega al nodo y luego sale poco después – Tung

+0

El arrival_time es el momento en que el autobús llega a la parada del autobús y departure_time es el momento cuando el el autobús sale de la parada de autobús después de recoger a los pasajeros. –

+0

@Dax, la consulta que sugirió no se asegurará de que las paradas 1 y 2 aparezcan en la ruta. Devolverá rutas que contengan cualquiera de los dos. + -------------- + | 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` 
); 

No puedo intentarlo ahora, pero espero que la sintaxis sea correcta. Lo que hice fue seleccionar las rutas que pasan por 3 y luego he comprobado si se detienen en 1 más adelante. Suelo trabajar con SQLite que permite cambiar el nombre de tablas para las máquinas multifuncionales querys al igual que he hecho en SELECT route_number R2

+0

No estoy seguro de si puede hacer eso en MySQL porque devuelve el siguiente error 'ERROR 1146 (42S02): Tabla 'R1.rute_timings' doesn 't existe'. –

+0

Acabo de descubrir que esto funciona si elimina todas las comillas – Erpheus

Cuestiones relacionadas