最大値を持つ行のみを選択する SQL クエリ
P粉752479467
P粉752479467 2023-08-22 10:03:28
0
2
439

ドキュメント テーブルがあります (これは簡略化されたバージョンです):

<テーブルクラス="s-テーブル"> <頭> idrevコンテンツ <みんな> 11... 21... 12... 13...

ID ごとに 1 行を選択し、最大のリビジョンのみを選択するにはどうすればよいですか?

上記のデータに基づくと、結果には [1, 3, ...] および [2, 1, ..] の 2 つの行が含まれるはずです。 ;。私は MySQL を使用しています。

現在、while ループ内のチェックを使用して、結果セット内の古い Rev を検出して上書きしています。しかし、これが結果を達成する唯一の方法でしょうか? SQL の解決策はありませんか?

P粉752479467
P粉752479467

全員に返信 (2)
P粉667649253

使用するコードはできるだけ少なくしたいと思っています...

INを使用して達成できます これを試して:### リーリー

私の意見では、これはよりシンプルで、読みやすく、保守しやすいです。

いいねを押す+0
    P粉517475670

    ###一目見ただけで...###

    GROUP BY

    句でMAX集計関数を使用するだけで済みます。リーリー物事は決して単純ではありませんね。

    content

    列も必要であることに今気づきました。これは SQL で非常に一般的な問題です。特定のグループ化識別子に基づいて、列内の最大値に対応する完全なデータを見つけます。私のキャリアの中で、この質問をよく聞いてきました。実際、私は現在の職場での技術面接中にこれらの質問の 1 つに答えました。

    この質問は実際に非常に一般的であるため、Stack Overflow コミュニティは特にこのタイプの問題に対処するためのタグ

    greatest-n-per-group

    を作成しました。基本的に、この問題を解決するには 2 つの方法があります:

    単純な

    グループ識別子、グループ内の最大値を使用します

    サブクエリを使用して接続しますこのアプローチでは、最初にサブクエリで

    group-identifier, max-value-in-group

    (上ですでに解決済み) を見つけます。次に、等結合にgroup-identifiermax-value-in-groupを使用して、テーブルをサブクエリと結合します。 リーリー左結合に自己結合を使用し、接続条件とフィルタリング条件を調整します

    このアプローチでは、テーブルをそれ自体に結合したままにします。

    グループ識別子

    での等結合。次に、2 つの賢いステップがあります:

    2 番目の接続条件は、左側の値が右側の値より小さいことです。

      ステップ 1 を実行すると、実際に最大値を持つ行の右側に
    1. NULL
    2. が表示されます (これは
    3. LEFT JOINであることに注意してください)。次に、結合結果をフィルタリングして、右側にNULLを持つ行のみを表示します。つまり、最終的には次のようになります:
    4. リーリー ###結論は###
    これら 2 つの方法で得られる結果はまったく同じです。

    同じ

    group-identifier

    max-value-in-group

    を持つ 2 つの行がある場合、両方のメソッドの結果に両方の行が含まれます。

    どちらの方法も SQL ANSI と互換性があるため、使用している RDBMS に関係なく、その「スタイル」に関係なく両方の方法を使用できます。どちらの方法も非常に効率的ですが、具体的な効果は異なる場合があります (RDBMS、データベース構造、インデックスなど)。したがって、これらの方法のいずれかを選択する場合は、ベンチマーク

    を使用してください。そして、自分にとって最も合理的な方法を必ず選択してください。

    いいねを押す+0
      最新のダウンロード
      詳細>
      ウェブエフェクト
      公式サイト
      サイト素材
      フロントエンドテンプレート
      私たちについて 免責事項 Sitemap
      PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!