1

この小さなテーブルを考えてみてください

Insert into Temp (key1, key2, value1, value2) VALUES
(10, 100, 20, 200),
(11, 101, 19, 199),
(12, 102, 21, 202);

私が走れば

SELECT MAX(key1), MIN(key2) FROM Temp;

私は得る

12, 100

予想通り。

また、これらのキーに関連付けられた値を返したいと思います。

SELECT MAX(key1), value1-which-has-that-max-key, MIN(key2), value2-which-has-that-min-key FROM Temp;

この例では、これを返す必要があります

12, 21, 100, 200

どうすればいいですか?ありがとう

4

2 に答える 2

3

サブセレクトを使用できます。

SELECT
    MAX(T1.key1) AS maxkey1,
    (SELECT value1 FROM Temp AS T2 WHERE T2.key1 = MAX(T1.key1)) AS value1,
    MIN(T1.key2) AS minkey2,
    (SELECT value2 FROM Temp AS T3 WHERE T3.key2 = MIN(T1.key2)) AS value2
FROM Temp T1

オンラインで動作することを確認してください: sqlfiddle

同じ最小値/最大値を持つキーが複数ある場合、これは失敗することに注意してください。このような状況が発生する可能性がある場合はORDER BY ... LIMIT 1、エラーを表示するのではなく、行の 1 つを選択して追加することをお勧めします。

于 2012-07-23T19:07:28.433 に答える
1

または、2つの派生テーブルを使用して、それぞれが順序付けられた行セットから最上位の行を返すこともできます。1つは行セットをの降順で並べ替え、もう1つはkey1の昇順で並べ替えますkey2。これは私が意味することです:

SELECT
  max.key1,
  max.value1,
  min.key2,
  min.value2
FROM
  (SELECT key1, value1 FROM Temp ORDER BY key1 DESC LIMIT 1) max,
  (SELECT key2, value2 FROM Temp ORDER BY key2  ASC LIMIT 1) min
;

「ライブ」デモンストレーションはSQLFiddleにあります。

key1同じ最大値または同じ最小値を持つ複数の行が存在する可能性がある(そして実際に発生する)場合key2、このクエリは機能しますが、Mark Byersが彼のソリューションについて述べたのと同様に、追加の基準を追加することをお勧めします結果を(より)予測可能にするために、ORDERBYに追加します。

于 2012-07-25T19:43:57.793 に答える