繁体   English   中英

MySQL:从一栏中选择多个最大值

[英]MySQL: Select multiple max values from one column

假设我有这张桌子:

mytable

 +------+-------+ | type | count | +------+-------+ | red | 4 | | blue | 3 | | red | 2 | | blue | 7 | +------+-------+ 

现在我要回来:

 +--------+---------+ | maxRed | maxBlue | +--------+---------+ | 4 | 7 | +--------+---------+ 

我怎样才能做到这一点?

这就是我尝试过的

SELECT MAX(count) as maxRed, 0 as maxBlue FROM mytable WHERE type='red'

UNION

SELECT 0 as maxRed, MAX(count) as maxBlue FROM mytable WHERE type='blue'

但这并不完全有效,只会产生结果

 +--------+---------+ | maxRed | maxBlue | +--------+---------+ | 4 | 0 | | 0 | 7 | +--------+---------+ 

为了使查询正常工作,您只需要用另一个查询将其包装即可:

SELECT MAX(maxRed) as maxRed, MAX(maxBlue) as maxBlue
FROM(
    SELECT MAX(count) as maxRed, 0 as maxBlue FROM mytable WHERE type='red'
    UNION
    SELECT 0 as maxRed, MAX(count) as maxBlue FROM mytable WHERE type='blue') t

一种更优雅的方法是条件聚合:

SELECT MAX(CASE WHEN t.type = 'red' THEN t.count END) as maxRed,
       MAX(CASE WHEN t.type = 'blue' THEN t.count END) as maxBlue
FROM mytable t
WHERE t.type IN('blue','red')

这是怎么做的:

SELECT
MAX(CASE WHEN type = 'red' THEN `count` ELSE NULL END) AS maxRed,
MAX(CASE WHEN type = 'blue' THEN `count` ELSE NULL END) AS maxBlue
FROM
mytable
WHERE type IN ('red', 'blue');
SELECT type,MAX(count) FROM mytable group by type 

这将以垂直而不是水平的方式返回类型和最大计数,并且可扩展为n个记录。

如果水平数据无关紧要,则可以使用上面建议的答案来解决用例,但对于每个不同的数据值,则需要用例。

编辑由于下面的注释我在真实数据上进行了测试,因此对mytable进行索引时,对于大型表,我的版本要快一些。 对于那些争论的人,请测试一下自己并报告。

 select 
(select max(count) from mytable  WHERE type='red') aa,
(select max(count) from mytable  WHERE type='blue') bb

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM