クイック変数を使用します。
SELECT @max := max(value) from scores;
SELECT id, value FROM scores WHERE value = @max;
そうでなければ:(そして、私は通常、サブクエリに断固として反対していますが、これは簡単です.
SELECT id, value FROM
scores
INNER JOIN (Select max(value) as value from scores) as max USING(value)
これらは両方とも、より基本的な `WHERE value = ( subquery ) よりも好ましいことに注意してください。それぞれについて、MAX 値を見つけるためのクエリが 1 回だけ実行されるためです (これが絶対的に保証されることが、変数ベースのソリューションを好む理由です)。 . サブクエリ バージョン (JOIN ではなく WHERE) では、そのクエリは行ごとに 1回実行される可能性があります。
でいくつかのクエリ分析をEXPLAIN EXTENDED
行いましたが、INNER JOIN メソッドはおそらくすべての提案の中で最も簡潔で最適です (MySQL 変数を使用するのが面倒な環境にいると仮定すると、それでも最もクリーンだと思います)。
パフォーマンス:
いくつかの興味深い議論が行われたので、私はこれらのことを本当に掘り下げて評価することにしました (やり過ぎだと思いますが、より大きな問題に関する楽しくて役立つ知識です)。テーブル全体のスキャンを検出するためのちょっとした分析トリックがあります。問題のサブクエリに追加WHERE (@foo := @foo + 1)
し、@foo を 0 に設定し、クエリを実行し、@foo が何であるかを確認します。これは、すべてを網羅するクエリ メトリックではありませんが、MySQL に各行の評価を依頼する頻度について非常に有益な情報となります。サンプル データの「スコア」は次のとおりです (低いほど良い)。
- @ctrahey (両方): 5 (一度スキャンして MAX を見つけます)
- @Joe Stefanelli: 25 (行ごとに 1 回スキャン(5*5))
- @Jocelyn:17(これについては説明できませんが、理由を知りたいです:-)