mysql - 从 SQL 表中获取值

标签 mysql sql

我有这样的表格:

飞行腿

+------+-----+-------+------+---------------------+---------------------+-------+
| 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 子句中确定。

附带说明:如果序列号不是订单的良好决定因素,那么您可以使用日期来确定订单或边。

Sample SQL Fiddle

关于mysql - 从 SQL 表中获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28922144/

相关文章:

MySQL 查询按字母顺序 A-Z 但 "AA"之后是 "Z"

php - 如何通过带有 session 值的存储过程将数据插入表?

mysql - 在 Joomla 中更新数据库的多行和多列

c# - 无法保存到数据库或从中检索(正确的信息)

mysql - 无法在 InnoDB 中添加外键

mysql - 如何将MySQL数据库导入SOLR

c# - 带有附加列的sql批量插入

mysql - 多行更新导致唯一的 "Integrity constraint violation"

SQL - 获取跨日期范围的平均值

SQL嵌套查询可能吗?