我有一大堆关于机场之间的航班信息,涉及到的内容和IT技术有关。
每个机场都有一个ID和(x,y)坐标。
对于属于某个用户的给定航班列表,我想找出访问过的最北端(y值最高)的机场。
这是我目前正在使用的查询:
SELECT name,iata,icao,apid,x,y
FROM airports
WHERE y=(SELECT MAX(y)
FROM airports AS a
, flights AS f
WHERE (f.src_apid=a.apid OR f.dst_apid=a.apid) AND f.uid=[user_id]
)
这个方法非常有效,速度也很快,但只有在
y
唯一的情况下才有效(即该纬度只有一个机场),否则会失败。不幸的是,这种情况经常发生,例如,军用和民用机场虽然占据相同的坐标,但仍有不同的条目。我真正想做的是在子查询中找到具有
MAX(y)
的机场,并返回实际匹配的机场(a.apid
),而不是返回y
的值,然后再进行匹配。你有什么建议吗?
假设用户只有这一次航班,从apid '3728' 开始:
mysql> select * from flights where uid=35 and src_apid=3728 limit 1;
+------+----------+----------+----------+----------+------+------+-----------+-------+--------+------+------+------+--------+----------+--------------+--------------+---------------------+------+------------+------+
| uid | src_apid | src_time | dst_apid | distance | code | seat | seat_type | class | reason | plid | alid | trid | fid | duration | registration | note | upd_time | opp | src_date | mode |
+------+----------+----------+----------+----------+------+------+-----------+-------+--------+------+------+------+--------+----------+--------------+--------------+---------------------+------+------------+------+
| 35 | 3728 | NULL | 3992 | 4116 | NW16 | 23C | A | Y | L | 167 | 3731 | NULL | 107493 | 08:00:00 | | del. typhoon | 2008-10-04 10:40:58 | Y | 2001-08-22 | F |
+------+----------+----------+----------+----------+------+------+-----------+-------+--------+------+------+------+--------+----------+--------------+--------------+---------------------+------+------------+------+
这里存在两个坐标相同的机场:
mysql> select * from airports where y=21.318681;
+-----------------------+----------+---------------+------+------+-------------+-----------+-----------+------+------+----------+------+
| name | city | country | iata | icao | x | y | elevation | apid | uid | timezone | dst |
+-----------------------+----------+---------------+------+------+-------------+-----------+-----------+------+------+----------+------+
| Honolulu Intl | Honolulu | United States | HNL | PHNL | -157.922428 | 21.318681 | 13 | 3728 | NULL | -10 | N |
| Hickam Air Force Base | Honolulu | United States | | PHIK | -157.922428 | 21.318681 | 13 | 7055 | 3 | -10 | N |
+-----------------------+----------+---------------+------+------+-------------+-----------+-----------+------+------+----------+------+
如果运行原始查询,子查询将返回y=21.318681,这将匹配apid 3728(正确)或apid 7055(错误)。