P粉5187995572023-08-21 13:24:03
正しい解決策は次のとおりです:
リーリー ###使い方:### の各行と、同じ Group
列値およびより大きな Age
列値を持つ b
のすべての行と一致します。一致する行。 Age
列のグループ内で最大値を持たない o
の行は、b
の 1 つ以上の行と一致します。
グループ内の最年長者 (単独の人も含む) と行 NULL
from b
( '年上の人はいないグループ内の年齢')。
INNER JOIN を使用すると、これらの行は一致せず、無視されます。
句は、b
から抽出されたフィールド内の NULL
を持つ行のみを保持します。彼らは各グループの最年長です。
###参考文献###
このソリューションと他の多くのソリューションは、書籍
P粉7416783852023-08-21 12:41:11
mysql でこれを行う非常に簡単な方法があります:
リーリーこのメソッドが機能するのは、mysql では列によるグループ化以外の集計を できないためです。その場合、mysql は 最初の行 のみを返します。解決策は、まずデータを希望する順序で並べ替えてから、希望する列ごとにグループ化することです。
複雑なサブクエリがmax() などを見つけようとする問題を回避し、同じ最大値を持つ複数の行がある場合に複数の行を返す問題も回避します (他の回答はこれを行います) )。
注: これは、mysql の のみのソリューションです。私が知っている他のデータベースはすべて、「非集計列が group by 句にリストされていません」または同様のエラー メッセージを含む SQL 構文エラーをスローします。このソリューションは 文書化されていない 動作を使用しているため、より賢明な人は、MySQL の将来のバージョンでこの動作が変更された場合でも動作することを確認するテストを組み込むことをお勧めします。
バージョン 5.7 アップデート:sql-mode 設定にはデフォルトで ONLY_FULL_GROUP_BY
が含まれるため、これを機能させるには このオプションは使用しないでください (この設定を削除するには、サーバーのオプション ファイルを編集してください)。