SQL在聚合结果中获取关联的列

时间:2012-07-23 19:04:37

标签: mysql sql

考虑这个小桌子

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

我该怎么做?感谢

2 个答案:

答案 0 :(得分: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 :(得分: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
;

可以找到“实时”演示at SQL Fiddle

如果可以(并且实际上)有多个行具有相同的最大值key1或相同的最小值key2,则此查询将起作用,但是,类似于Mark Byers谈到他的解决方案时,我会建议在ORDER BYs中添加额外的标准,以使结果(更多)可预测。