2012-03-13 279 views
5

我一直在试图为公共交通系统编写一个查询,当我输入起点和终点站号时,它将输出路线列表。嵌套的MySQL查询

这里是我的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) 

下面是样本值:

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) 

我的问题是:如果我想列出ROUTE_NUMBER的,将包含stop_number 1和stop_number 3,我会写类似这样的查询:

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

但是,上面的查询只会返回包含两个站点的route_number,而不是源站点(1)在目标站点(3)之前到达的路线。

查询将返回以下:

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

的ROUTE_NUMBER 60不会从1开始,到3,而是从3开始并且前往1.是否有人可以帮助我,有点添加到查询以便查询仅输出其中stop_number 1的到达时间小于stop_number 3的到达时间的route_number。

在此先感谢。 -Shain

回答

1

做了如何像重命名为联合收割机querys工作表约定我习惯了,但原则应该清楚

+1

这就是我一直在寻找。非常感谢你。 – 2012-03-13 09:28:14

0

用途:

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

注:为什么DEPARTURE_TIME为>比ARRIVAL_TIME?

+0

我认为这是因为运输到达节点,然后很快离开 – Tung 2012-03-13 09:10:10

+0

到达时间是公交车到达公交车站的时间,departure_time是时间巴士在接客之后离开巴士站。 – 2012-03-13 09:12:31

+0

@Dax,您建议的查询不会确保路线1和2都出现在路线中。它将返回包含这两者中任何一个的路线。 + -------------- + | route_number | + -------------- + | 54 | | 55 | | 60 | + -------------- + – 2012-03-13 09:14:29

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

我现在不能尝试,但我希望语法是正确的。我所做的是选择经过3的路线,然后检查他们是否稍后停在1。这是使用SQL Server的语法和名称

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 

注意调整为:我通常使用SQLite,让像我在SELECT route_number R2

+0

我不确定您是否可以在MySQL中执行此操作,因为它会返回以下错误:错误1146(42S02):表'R1.route_timings'doesn '不存在'。 – 2012-03-13 09:22:02

+0

我刚刚发现这个作品,如果你删除所有的引号 – Erpheus 2012-03-15 11:22:00