mysql - 嵌套的 MySQL 查询

标签 mysql sql nested-queries

我一直在尝试为公共(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/

相关文章:

elasticsearch - Elasticsearch :限制数组中的搜索结果

elasticsearch - Elasticsearch:嵌套映射在搜索上引发错误

php laravel 从过去一周的数据库中获取数据

php - 如何在服务器上的同构应用程序中获取某个位置的经纬度

php - Vtiger6如何与现有网站集成

mysql - 尝试编写一个查询来获取最高和最低收入并打印帐户健康状况?

c# - 嵌套包含 Entity Framework Core

ruby - 尝试使用 Rails 4.0.0 设置 ROR 环境,但 Webrick Webserver 无法运行 uaing Rails

sql - 从公用表表达式中的 INSERT 中使用的子选择返回数据

mysql - SQL索引优化WHERE查询