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
查看查询计划?