带有max

时间:2018-10-12 17:13:43

标签: mysql sql-server join max inner-join

我对查询进行了练习,但似乎无法找到其中一个的解决方案。我有两个表:飞机和合格证。

在飞机表格中,我有以下信息: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,但是我确实找不到解决方案,并且我试图分解我的代码,但仍然是不可能的。

谢谢

2 个答案:

答案 0 :(得分:0)

  • 首先,使用CrusingrangeEID获得Join的最大值Group By。将此结果用作Derived table
  • 现在,使用最大值CrusingrangeEID再次加入回到主表。

对于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