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

Mysql SQL获取聚合结果中的关联列,mysql,sql,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; 我明白了 正如所料 我还想返回与这些键相关的值,比如 SELECT MAX(key1), value1-which-has-that-max-key, MIN(k

考虑一下这张小桌子

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;
我明白了

正如所料

我还想返回与这些键相关的值,比如

SELECT MAX(key1), value1-which-has-that-max-key, MIN(key2), value2-which-has-that-min-key FROM Temp;
在这个例子中应该返回哪个

12, 21, 100, 200

我该怎么做?谢谢

您可以使用子选择:

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
在线查看它的工作情况:


请注意,如果有多个密钥具有相同的最小值/最大值,则此操作将失败。如果您可能遇到这种情况,您可能需要添加一个
orderby。。。限制1,因此选择一行而不是给出错误。

您可以使用子选择:

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
在线查看它的工作情况:


请注意,如果有多个密钥具有相同的最小值/最大值,则此操作将失败。如果您可能遇到这种情况,您可能需要添加一个
orderby。。。限制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
;
可以找到“现场”演示


如果可以(并且实际上碰巧)有多行具有相同的最大值
key1
或相同的最小值
key2
,此查询将起作用,但是,与Mark Byers所说的解决方案类似,我建议向ORDER BY添加额外的条件以生成结果(更多)可预测。

或者,您可以使用两个派生表,每个派生表将从有序行集中返回最顶层的行。一个将按
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
;
可以找到“现场”演示


如果可以(并且实际上碰巧)有多行具有相同的最大值
key1
或相同的最小值
key2
,此查询将起作用,但是,与Mark Byers所说的解决方案类似,我建议向ORDER BY添加额外的条件以生成结果(更多)可预测。

我关心的是效率。不是每个子选择都会对表执行额外的传递吗?如果您有适当的索引,它将不需要扫描表。我假设,如果您关心效率,那么您已经了解了将适当的索引添加到表中的索引,对吗?您是否使用
EXPLAIN
查看查询计划?我担心效率。不是每个子选择都会对表执行额外的传递吗?如果您有适当的索引,它将不需要扫描表。我假设,如果您关心效率,那么您已经了解了将适当的索引添加到表中的索引,对吗?您是否使用
EXPLAIN
查看查询计划?