假设我有以下表格:
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
但是,我仍然坚持如何从这个子查询中找到最大行。
P.S。我也在寻找与MySQL兼容的查询,如果这有任何区别的话。
答案 0 :(得分: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;
答案 1 :(得分: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;
这将返回一行,由于排序,它将包含最大平均年龄。
答案 2 :(得分: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