gpt4 book ai didi

sql - 具有多个类似子选择的 mysql update 命令

转载 作者:行者123 更新时间:2023-11-29 14:55:36 26 4
gpt4 key购买 nike

我编写了以下 UPDATE 命令,但子选择中有冗余。我不是 SQL 专家,希望您能帮助我提高查询效率。提前致谢。

update trips
set origin =
(select stop_name
from stops
inner join stop_times
on stops.stop_id = stop_times.stop_id
where stop_times.trip_id = trips.trip_id
order by stop_sequence asc
limit 1)
,
destination =
(select stop_name
from stops
inner join stop_times
on stops.stop_id = stop_times.stop_id
where stop_times.trip_id = trips.trip_id
order by stop_sequence desc
limit 1)
,
starts =
(select arrival_time
from stop_times
where stop_times.trip_id = trips.trip_id
order by stop_sequence asc
limit 1)
,
ends =
(select arrival_time
from stop_times
where stop_times.trip_id = trips.trip_id
order by stop_sequence desc
limit 1)
;

下面是相关的表定义。大约有72K行程、8K 次 parking 和 200 万次 parking 次数。也许平均20?停止每次旅行(只是猜测)。

create table stop_times (
trip_id varchar(255),
arrival_time time,
stop_id varchar(255),
stop_sequence int unsigned,
) type=MyISAM;

alter table stop_times add index stop_id (stop_id(5));
alter table stop_times add index trip_id (trip_id(5));

create table stops (
stop_id varchar(255),
stop_name varchar(255),
stop_lat float,
stop_lon float,
primary key (stop_id)
) type=MyISAM;

create table trips (
route_id varchar(255),
trip_id varchar(255), /* primary key is here */
/* denormalized fields */
origin varchar(255),
destination varchar(255),
starts time,
ends time,
primary key(trip_id)
) type=MyISAM;
alter table trips add index route_id (route_id(5));

最佳答案

首先在 stop_times 上添加索引以包含 trip_id 和 stop_sequence 列

ALTER TABLE stop_times ADD PRIMARY KEY(trip_id, stop_sequence)

然后,尝试运行此更新:

update trips t JOIN (
SELECT trip_id, MIN(stop_sequence) minS, MAX(stop_sequence) maxS
FROM stop_times
GROUP BY trip_id
) tg ON t.trip_id = tg.trip_id
JOIN stop_times stFirst ON tg.trip_id = stFirst.trip_id AND stFirst.stop_sequence = tg.minS
JOIN stop_times stLast ON tg.trip_id = stLast.trip_id AND stLast.stop_sequence = tg.maxS
JOIN stops stFirstStop ON stFirst.stop_id = stFirstStop.stop_id
JOIN stops stLastStop ON stLast.stop_id = stLastStop.stop_id
SET t.origin = stFirstStop.stop_name,
t.destination = stLastStop.stop_name,
t.starts = stFirst.arrival_time,
t.ends = stLast.arrival_time

注意:将 trip_id 更改为 INT 将为您提供更好的性能

此外,行程表应存储 origin_id 和 destination_id,稍后可以将其连接到 Stops 表以查找名称,而不是将名称存储在所有行中

关于sql - 具有多个类似子选择的 mysql update 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4697099/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com