Mysql 从SQL表中获取值
我有这样的表:Mysql 从SQL表中获取值,mysql,sql,Mysql,Sql,我有这样的表: select flight_start.flno, flight_start.froma, flight_end.toa from flightleg flight_start join flightleg flight_end on flight_start.flno = flight_end.flno join ( select flno, min(seq) origin, max(seq) destination from flightl
select flight_start.flno, flight_start.froma, flight_end.toa
from flightleg flight_start
join flightleg flight_end on flight_start.flno = flight_end.flno
join (
select
flno,
min(seq) origin,
max(seq) destination
from flightleg
group by flno
having count(*) > 2
) min_max_seq
on flight_start.flno = min_max_seq.flno
and flight_start.seq = min_max_seq.origin
and flight_end.seq = min_max_seq.destination
飞行腿
+------+-----+-------+------+---------------------+---------------------+-------+
| FLNO | Seq | FromA | ToA | DeptTime | ArrTime | Plane |
+------+-----+-------+------+---------------------+---------------------+-------+
| 1000 | 1 | DFW | LOG | 2020-01-01 01:10:20 | 2020-01-01 01:13:40 | 7 |
| 1010 | 1 | LAX | ORD | 2020-01-01 01:13:10 | 2020-01-01 01:16:20 | 3 |
| 1020 | 1 | LOG | JFK | 2020-01-01 01:05:40 | 2020-01-01 01:06:20 | 9 |
| 1030 | 1 | LAX | INT | 2020-01-01 01:11:20 | 2020-01-01 01:16:10 | 6 |
| 1040 | 1 | LAX | LGA | 2020-02-01 01:15:30 | 2020-01-01 01:21:00 | 1 |
| 1010 | 2 | ORD | JFK | 2020-01-01 01:17:10 | 2020-01-01 01:20:20 | 3 |
| 1020 | 2 | JFK | DFW | 2020-01-01 01:07:20 | 2020-01-01 01:10:20 | 9 |
| 1030 | 2 | INT | DFW | 2020-01-01 01:17:20 | 2020-01-01 01:18:00 | 6 |
| 1020 | 3 | DFW | INT | 2020-01-01 01:11:10 | 2020-01-01 01:11:40 | 7 |
| 1020 | 4 | INT | LAX | 2020-01-01 01:12:20 | 2020-01-01 01:15:10 | 7 |
+------+-----+-------+------+---------------------+---------------------+-------+
这是:
飞行
+------+--------+---------+
| FLNO | Meal | Smoking |
+------+--------+---------+
| 1000 | Bistro | Y |
| 1010 | Meal | N |
| 1020 | Meal | Y |
| 1030 | Snack | N |
| 1040 | Meal | N |
+------+--------+---------+
我正在尝试编写一个查询,其中对于每个有两个以上航段的航班,检索航班号(FLNO)、首次出发城市(FromA)和航班的最终到达城市。飞行序列可以从任意整数开始,并可以由任意整数偏移量分隔
以下是我到目前为止的情况:
SELECT FlightLeg.FLNO, (
SELECT FlightLeg.FromA
FROM FlightLeg
INNER JOIN Flight
ON FlightLeg.FLNO=Flight.FLNO
GROUP BY FlightLeg.FLNO
HAVING COUNT(*) > 2),
(
SELECT FlightLeg.ToA
FROM FlightLeg
INNER JOIN Flight
ON FlightLeg.FLNO=Flight.FLNO
GROUP BY FlightLeg.FLNO
HAVING COUNT(*) > 2)
FROM FlightLeg
INNER JOIN Flight
ON FlightLeg.FLNO=Flight.FLNO
GROUP BY FlightLeg.FLNO
HAVING COUNT(*) > 2;
我所能得到的输出是正确飞行的第一个序列的FLNO,FromA,ToA
预期产出:
+------+-------+------+
| FLNO | FromA | ToA |
+------+-------+------+
| 1020 | LOG | LAX |
+------+-------+------+
我想我真的很接近,但我不确定如何找到FromA,最小序列和ToA,最大序列
有人能帮忙吗?谢谢 解决此问题的一种方法是使用自联接和派生表,如下所示:
select flight_start.flno, flight_start.froma, flight_end.toa
from flightleg flight_start
join flightleg flight_end on flight_start.flno = flight_end.flno
join (
select
flno,
min(seq) origin,
max(seq) destination
from flightleg
group by flno
having count(*) > 2
) min_max_seq
on flight_start.flno = min_max_seq.flno
and flight_start.seq = min_max_seq.origin
and flight_end.seq = min_max_seq.destination
用作派生表的查询确定每个航班的最低和最高序号,第一个联接使用较低的序号检索起点机场,而第二个联接使用较高的序号检索目的地机场。支腿的数量在派生表中的having
子句中确定
另一方面:如果序列号不是顺序的良好决定因素,那么可以使用日期来确定顺序或分支
解决此问题的一种方法是使用自联接和派生表,如下所示:
select flight_start.flno, flight_start.froma, flight_end.toa
from flightleg flight_start
join flightleg flight_end on flight_start.flno = flight_end.flno
join (
select
flno,
min(seq) origin,
max(seq) destination
from flightleg
group by flno
having count(*) > 2
) min_max_seq
on flight_start.flno = min_max_seq.flno
and flight_start.seq = min_max_seq.origin
and flight_end.seq = min_max_seq.destination
用作派生表的查询确定每个航班的最低和最高序号,第一个联接使用较低的序号检索起点机场,而第二个联接使用较高的序号检索目的地机场。支腿的数量在派生表中的having
子句中确定
另一方面:如果序列号不是顺序的良好决定因素,那么可以使用日期来确定顺序或分支
小提琴:
(TommCatt为提高效率提出了修改)
这并不依赖于每个航班的seq
是按升序排列的
小提琴:
(TommCatt为提高效率提出了修改)
这并不依赖于每个航班的
seq
按升序排列。您能添加您的预期输出吗?为什么输出应该是1020 LOG LAX
?另外,虽然您如何包含表很好,但它们没有标记名称,第二个表似乎不相关。@添加了CoderofCode预期输出。@添加了Turophile表标签。第二种是不相关的。但我认为,当您首先在两个表中搜索匹配的FLNO时,这会更容易。您可以添加预期的输出吗?为什么输出应该是1020 LOG LAX
?另外,虽然您如何包含表很好,但它们没有标记名称,第二个表似乎不相关。@添加了CoderofCode预期输出。@添加了Turophile表标签。第二种是不相关的。但我认为,当您首先在两个表中搜索匹配的FLNO时,这会更容易。航班序列可以从任意整数开始,并可以由任意整数偏移量分隔。
不确定在这种情况下使用max和min on序列是否有效(不确定其是否可靠),但是我喜欢这个query@JohnRuddell我也注意到了这一点,但我认为序列是向上增长的。是的,我希望这就是任何人存储数据的方式。。。但是我有时看到一些奇怪的事情,lol+1从我这里传来,虽然飞行序列可以从一个任意的整数开始,并且可以被一个任意的整数偏移量分开。
不确定在这种情况下使用max和min on序列是否有效(不确定它是否可靠),但我喜欢query@JohnRuddell我也注意到了,,但是我假设序列是向上增长的。是的,我希望这就是任何人存储数据的方式。。。但是我有时看到一些奇怪的事情,我觉得使用日期比使用“任意”的seq值要好得多。始终选择最有意义的数据。但是,如果我可以建议稍微改变,只执行一个连接,而不是两个:同意re:删除一个连接最好使用日期,而不是如所述的“任意”seq值。始终选择最有意义的数据。然而,如果我可以建议一个轻微的变化,只执行一个连接而不是两个:同意re:删除其中一个连接