sql与max的内部连接

bpsygsoo  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(362)

这个问题在这里已经有答案了

sql仅选择列上具有最大值的行[重复](27个答案)
两年前关门了。
我有一个关于查询的练习,但我似乎找不到解决其中一个问题的方法。我有两张table:飞机和认证。
在aircrafts表中,我有信息辅助(飞机id)、aname(飞机名称)和crusingrange(飞机的最大距离):

AID    Aname       Crusingrange            
1     BoeingFr        25000   
2     BoeingUS        50000   
3      Jet01          3000  
4      Jet02          4000

在认证表中,我有以下信息帮助(飞机id)和eid(飞行员id):

AID    EID                   
1      199     
2      199  
1      110         
3      110        
3      109  
4      109

我想要的是飞行员的身份证和他/她能飞的最大巡航距离的飞机的身份证。

EID    AID                   
199     2    
110     1  
109     4

我知道我必须在innerjoin中使用max,但我真的没有找到解决方案,我尝试分解代码,但仍然不可能。
谢谢您

zsohkypk

zsohkypk1#

如果数据库支持 row_number() 窗口函数,则可以联接表,然后按 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
4jb9z9bj

4jb9z9bj2#

首先,得到最大值 Crusingrange 为了一个 EID ,使用 Join 以及 Group By . 将此结果用作派生表。
现在,再次使用 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

相关问题