1

假设我有以下表格:

Sailor(sid, sname, age)  
Boat(bid, sid)

每艘船可以有许多水手,每个水手可以在许多船上服务。我要做的是找到水手平均年龄最高的船。

我可以用这个子查询找到每艘船上水手的平均年龄:

SELECT b.bid, AVG(s.age) AS avg_age FROM sailor s, boat b
WHERE b.sid = s.sid
GROUP BY b.bid

但是,我被困在如何进一步从这个子查询中找到最大行。

PS 我也在寻找与 MySQL 兼容的查询,如果这有什么不同的话。

4

3 回答 3

2
SELECT t1.*
FROM
 (SELECT b.bid, AVG(s.age) AS avg_age FROM sailor s, boat b
  WHERE b.sid = s.sid
  GROUP BY b.bid) t1
LEFT OUTER JOIN
 (SELECT b.bid, AVG(s.age) AS avg_age FROM sailor s, boat b
  WHERE b.sid = s.sid
  GROUP BY b.bid) t2
 ON (t1.avg_age < t2.avg_age)
WHERE t2.avg_age IS NULL;
于 2009-09-29T01:01:12.207 回答
1
SELECT b.bid, AVG(s.age) AS avg_age 
FROM sailor s JOIN boat b USING (sid)
GROUP BY b.bid
ORDER BY AVG(s.age) DESC
LIMIT 1;

这将返回一行,并且由于排序,它将包含最大平均年龄。

于 2009-09-29T01:00:40.430 回答
1

在 sql server 中,它将是:

  Select Top 1 Bid, Avg(age)
  From boat b Join sailor s 
     On s.sid = b.sid
  Group By Bid
  Order By Avg(Age) Desc

我不喜欢 MySQL,但是有一个 Linmit 关键字可以“限制”返回的行数,如果你使用它而不是 Top 1,它应该可以工作,不是吗?我不太确定语法,但是...

  Select  Bid, Avg(age)
  From boat b Join sailor s 
     On s.sid = b.sid
  Group By Bid
  Order By Avg(Age) Desc
   Limit 1 
于 2009-09-29T01:47:09.853 回答