我对查询进行了练习,但似乎无法找到其中一个的解决方案。我有两个表:飞机和合格证。
在飞机表格中,我有以下信息:AID(飞机的ID),Aname(飞机的名称)和Crusingrange(飞机的最大距离):
AID Aname Crusingrange
1 BoeingFr 25000
2 BoeingUS 50000
3 Jet01 3000
4 Jet02 4000
在CERTIFIED表中,我具有以下信息:AID(飞机的ID)和EID(飞行员的ID):
AID EID
1 199
2 199
1 110
3 110
3 109
4 109
我想要的是飞行员的ID和他/她可以飞行的最大巡航距离的飞机的ID。
EID AID
199 2
110 1
109 4
我知道我必须在INNER JOIN中使用MAX,但是我确实找不到解决方案,并且我试图分解我的代码,但仍然是不可能的。
谢谢
答案 0 :(得分:0)
Crusingrange
和EID
获得Join
的最大值Group By
。将此结果用作Derived table。Crusingrange
和EID
再次加入回到主表。对于MySQL,请尝试以下操作:
SELECT c1.EID,
a1.AID
FROM CERTIFIED AS c1
JOIN Aircrafts AS a1 ON a1.AID = c1.AID
JOIN
(
SELECT c.EID,
MAX(a.Crusingrange) AS Crusingrange
FROM CERTIFIED AS c
JOIN Aircrafts AS a ON a.AID = c.AID
GROUP BY c.EID
) AS dt ON dt.Crusingrange = a1.Crusingrange AND
dt.EID = c1.EID
答案 1 :(得分:0)
如果您的数据库支持row_number()
窗口函数,则可以联接表,然后按Crusingrange对EID
的行进行排序,并选择最长的行:
SELECT EID, AID FROM (
SELECT CERTIFIED.AID, CERTIFIED.EID, row_number() over(partition by CERTIFIED.EID ORDER BY Aircrafts.Crusingrange DESC) rn
FROM CERTIFIED
JOIN Aircrafts
ON CERTIFIED.AID = Aircrafts.AID
) t
WHERE rn = 1