我有三个数据库表:routes
、trips
和stoptimes
,其中包含运输信息。它们与外键的关系如下:
routes -> ROUTE_ID -> trips -> TRIP_ID -> stoptimes
即有一些路线,每条路线有很多次旅行,每次旅行甚至更多的停留时间。
对于表中的每条路线,我想选择停留时间最多的行程。
此外,每条路线也有一个枚举(INT)direction_id
,我想为每条路线选择每个方向停留时间最多的行程。
这都是为了一些数据预处理,想法是这些选定的行程将在它们上设置一个标志,以便将来可以轻松地调用它们。
是否有可能在 SQL 中实现这一点?
编辑:
根据要求提供更多信息。这是一个示例 SELECT 查询/结果表:
select t.route_id, t.direction_id, t.trip_id, NumStops, t.isPrototypical
from trips t join
(select st.trip_id, count(*) as NumStops
from stoptimes st
group by st.trip_id
) st
on st.trip_id = t.trip_id;
结果:
在上面的示例中,我想要一个 SQL 语句来选择行程 2 和 10,因为它们在每个方向上都有(相等)最大的 NumStops。更好SELECTING
的是,而不是 SQL 语句可以UPDATE
将列isPrototypical
用于TRUE
那些特定的行。
请记住:在生产数据库中,每次行程都会有多个route_id
和任意数量的direction_id
s。该声明需要为每个方向和每个路线发挥作用。
最终答案
下面的 Gordon Linoff 提供了一个正确的、性能良好的解决方案,我想我也会发布他用来解决问题的代码的修改版本。
这是选择和更新每条路线、每个方向的停靠点最多的行程的 SQL,而在出现平局时只选择一次行程:
update trips t join ( select substring_index(group_concat(t.trip_id order by NumStops desc), ',', 1) as prototripid from trips t join
(select st.trip_id, count(*) as NumStops
from stoptimes st
group by st.trip_id
) st
on st.trip_id = t.trip_id group by t.route_id, t.direction_id ) t2 on t2.prototripid = t.trip_id set isPrototypical = 1 ;
我相信这可能是 MySQL 特有的。