2

私はまだSQLを学んでいるので、次のことを行うためのより良い方法があるかどうか疑問に思いました。

列の最小値と最大値の行データを取得する必要があります(これをcolumnAと呼びます)。私は使うだろう:

SELECT *
  FROM table
 ORDER BY columnA
  DESC LIMIT 1

問題は、次の理由で1つの結果しか得られないLIMIT 1ことですが、ColumnAには同じ最小値/最大値があり、他の列には異なる値がある可能性があります。他の行も必要です。

ありますがSELECT(MAX)、それでも1行のデータしか生成されないと思います。

私がこれを行うと考える方法は、最高/最低のcolumnA値を変数に入れてから、2番目のクエリに戻すことです。これを単一のクエリで行うには、エイリアステーブルをOR使用しLEFT JOINますが、もっと直接的な方法はありますか?

4

2 に答える 2

3

最も簡単な方法は、サブクエリを実行することです。

SELECT * FROM MyTable WHERE columnA = (SELECT MAX(columnA) FROM MyTable);

両方の極値を一度に照会することもできます。

SELECT * FROM MyTable
WHERE columnA = (SELECT MAX(columnA) FROM MyTable);
   OR columnA = (SELECT MIN(columnA) FROM MyTable);

私は次のものをテストしていません(MySQLUNIONがサブクエリでサポートしているかどうかはわかりません)が、それも機能するはずですが、もう少し効率的かもしれません(データサイズによって異なります)。

SELECT * FROM MyTable
WHERE columnA IN (
    SELECT MAX(columnA) FROM MyTable
    UNION
    SELECT MIN(columnA) FROM MyTable
);
于 2012-09-25T11:24:04.423 に答える
2

別のオプションは:

SELECT * 
FROM MyTable m1 
WHERE not exists (select 1 from MyTable where columnA > m1.columnA)
于 2012-09-25T11:27:12.590 に答える