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;

これにより1行が返され、順序付けのため、最大平均年齢が含まれます。

于 2009-09-29T01:00:40.430 に答える
1

SQL サーバーでは次のようになります。

  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 に答える