[英]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.