排除使用一列中的最大值来检查另一列中的值的行?

时间:2011-06-23 01:50:55

标签: mysql group-by left-join max

对于这个不起眼的标题感到抱歉,但我不确定如何总结。

我正在处理几个表中提供给我的静态列车时刻表数据。我试图显示停在特定站点的所有列车,不包括指定站点 end 的列车。例如,当列出停在NYPenn车站的所有列车时,我不希望那些列车在NYPenn车站终止。

相关表格是:

trips - 列出每天所做的所有旅行。每次旅行都有一个trip_id,由一个或多个站点组成。它还包含一个trip_headsign列,显示列车的最终目的地,但是作为文本(不是ID)。

+----------+------------+---------+-------------------------+--------------+----------+----------+
| route_id | service_id | trip_id | trip_headsign           | direction_id | block_id | shape_id |
+----------+------------+---------+-------------------------+--------------+----------+----------+
|        1 |          1 |       1 |  PRINCETON RAIL SHUTTLE |            1 |      603 |        1 | 
|        1 |          2 |       2 |  PRINCETON RAIL SHUTTLE |            1 |      603 |        2 | 
+----------+------------+---------+-------------------------+--------------+----------+----------+

stop_times - 列出每列火车的每一站。在同一次旅行中进行的所有停靠共享一个trip_id,所以这就是我LEFT JOIN所做的。此表还有一个名为stop_sequence的列,范围从1到n,其中n是该行程的停靠总数。火车起源于stop_sequence=1。该值的范围为2到26。

+---------+--------------+----------------+---------+---------------+-------------+---------------+---------------------+
| trip_id | arrival_time | departure_time | stop_id | stop_sequence | pickup_type | drop_off_type | shape_dist_traveled |
+---------+--------------+----------------+---------+---------------+-------------+---------------+---------------------+
|       1 | 21:15:00     | 21:15:00       |   24070 |             1 |           0 |             0 |                   0 | 
|       1 | 21:25:00     | 21:25:00       |   41586 |             2 |           0 |             0 |              2.5727 | 
+---------+--------------+----------------+---------+---------------+-------------+---------------+---------------------+

这列火车只停两站。最后一站(41586)是在headign列中列出的(注意它与stop_name不匹配)。

+---------------+---------+---------+-------------------------+----------+----------------+
| stop_sequence | stop_id | trip_id | trip_headsign           | block_id | departure_time |
+---------------+---------+---------+-------------------------+----------+----------------+
|             1 |   24070 |       1 |  PRINCETON RAIL SHUTTLE |      603 | 21:15:00       | 
|             2 |   41586 |       1 |  PRINCETON RAIL SHUTTLE |      603 | 21:25:00       | 
+---------------+---------+---------+-------------------------+----------+----------------+

+---------+----------------------------+-----------+-----------+------------+---------+
| stop_id | stop_name                  | stop_desc | stop_lat  | stop_lon   | zone_id |
+---------+----------------------------+-----------+-----------+------------+---------+
|   41586 | PRINCETON RAILROAD STATION |           | 40.343398 | -74.659872 |     336 | 
+---------+----------------------------+-----------+-----------+------------+---------+

所以,再一次,我要做的是显示在特定车站停靠的所有列车的列表,除了在相关车站终止的列车。我写的这样做的查询是(在这种情况下,对于纽约宾州车站的stop_id 105):

select stop_sequence, trips.trip_id, trip_headsign, trips.block_id, departure_time from rail_data.trips left join rail_data.stop_times on trips.trip_id = stop_times.trip_id where stop_id = '105' order by departure_time asc;

返回如下结果:

+---------------+---------+-----------------------+----------+----------------+
| stop_sequence | trip_id | trip_headsign         | block_id | departure_time |
+---------------+---------+-----------------------+----------+----------------+
|            18 |    1342 | NEW YORK PENN STATION |     6600 | 05:43:00       | 
|             1 |    1402 | SUMMIT                |     6305 | 06:07:00       | 
|            16 |    1328 | NEW YORK PENN STATION |     6604 | 06:34:00       | 
|             1 |    1391 | SUMMIT                |     6307 | 06:41:00       | 
|            19 |    1360 | NEW YORK PENN STATION |     6908 | 06:47:00       | 
+---------------+---------+-----------------------+----------+----------------+

在这种情况下,我只希望火车前往SUMMIT出现。但请记住,我不能简单地说stop_sequence> 1因为我想要包括可能是第二,第三等等的列车停靠 - 只是不是最后一站。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您可以查询stop_times并检查其shape_dist_traveled == 0并获取相应的“行程ID”,然后使用此ID查询行程表。所以,你必须添加一个地方:

其中trips.trip_id in(从stop_times st中选择st.trip_id,其中st.shape_dist_traveled == 0)

P.S:我认为shape_dist_travelled会给出火车行驶的距离