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:删除其中一个连接