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所以选择其中一行而不是给出错误。

于 2012-07-23T19:07:28.433 回答
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
;

可以在 SQL Fiddle找到“现场”演示。

如果可以(并且实际上恰好)有多行具有相同的最大值key1或相同的最小值key2,则此查询将起作用,但是,与 Mark Byers 关于他的解决方案所说的类似,我建议添加其他条件到 ORDER BY 以使结果(更多)可预测。

于 2012-07-25T19:43:57.793 回答