我一直在尝试为公共(public)交通系统编写查询,当我输入起点站和终点站号码时,该系统会输出路线列表。
这是我的 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)
我的问题是:如果我想列出包含 stop_number 1 和 stop_number 3 的 route_number,我会编写一个类似于此的查询:
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_numbers,而不是源站点 (1) 在目标站点 (3) 之前到达的路线。
查询将返回以下内容:
+--------------+
| route_number |
+--------------+
| 54 |
| 60 |
+--------------+
route_number 60 不是从 1 开始到 3,而是从 3 开始到 1。有人可以帮我把那个位添加到查询中,以便查询只输出 route_numbers,其中 arrival_time 为 stop_number 1 小于 stop_number 3 的 arrival_time。
提前致谢。 -肖恩
最佳答案
怎么样:
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
请注意,这是根据我习惯的约定使用的 SQL 服务器语法和名称,但原则应该很清楚
关于mysql - 嵌套的 MySQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9680955/