Как выполняется следующий запрос?
Это работает, сначала находя самый северный Y кординат в наборе посещенных аэропортов. Затем выполняется идентичный запрос, который фильтруется по координате Y в предыдущем запросе. Последний шаг - найти аэропорт.
drop table airports;
drop table flights;
create table airports(
apid int not null
,apname varchar(50) not null
,x int not null
,y int not null
,primary key(apid)
,unique(apname)
);
create table flights(
flight_id int not null auto_increment
,src_apid int not null
,dst_apid int not null
,user_id varchar(20) not null
,foreign key(src_apid) references airports(apid)
,foreign key(dst_apid) references airports(apid)
,primary key(flight_id)
,index(user_id)
);
insert into airports(apid, apname, x, y) values(1, 'Northpole Civilian', 50, 100);
insert into airports(apid, apname, x, y) values(2, 'Northpole Military', 50, 100);
insert into airports(apid, apname, x, y) values(3, 'Transit point', 50, 50);
insert into airports(apid, apname, x, y) values(4, 'Southpole Civilian', 50, 0);
insert into airports(apid, apname, x, y) values(5, 'Southpole Military', 50, 0);
insert into flights(src_apid, dst_apid, user_id) values(4, 3, 'Family guy');
insert into flights(src_apid, dst_apid, user_id) values(3, 1, 'Family guy');
insert into flights(src_apid, dst_apid, user_id) values(5, 3, 'Mr Bazooka');
insert into flights(src_apid, dst_apid, user_id) values(3, 2, 'Mr Bazooka');
select airports.apid
,airports.apname
,airports.x
,airports.y
from (select max(a.y) as y
from flights f
join airports a on (a.apid = f.src_apid or a.apid = f.dst_apid)
where f.user_id = 'Family guy'
) as northmost
join (select a.apid
,a.y
from flights f
join airports a on (a.apid = f.src_apid or a.apid = f.dst_apid)
where f.user_id = 'Family guy'
) as userflights on(northmost.y = userflights.y)
join airports on(userflights.apid = airports.apid);
Edit. Альтернативный запрос, который может быть менее запутанным для оптимизатора
select airports.*
from (select case when s.y > d.y then s.apid else d.apid end as apid
,case when s.y > d.y then s.y else d.y end as northmost
from flights f
join airports s on(f.src_apid = s.apid)
join airports d on(f.dst_apid = d.apid)
where f.user_id = 'Family guy'
order by northmost desc
limit 1
) as user_flights
join airports on(airports.apid = user_flights.apid);