问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

MySQL查询优化:取多列最大最小值的两种方法

创作时间:
作者:
@小白创作中心

MySQL查询优化:取多列最大最小值的两种方法

引用
CSDN
1.
https://blog.csdn.net/xjx891111/article/details/125217022

有个需求是这样的,每天有24个小时,对应24个列,要求:取一段时间内某个小时的最值,并按倒序排列。如下图所示:

首先假设 表名为t表,字段date,name,以及one、two、three。。。,代表每个小时,这里以3个列为例。

解决方法:

  1. 使用列转行,每一列都转为一行数据,这样,直接比值就可以了。

优点:比较常用,可以不用先求出每行或每列的最大值,转换后直接比值即可。

缺点:大量使用union,union越多,性能越差,在数据量大的情况下不推荐。

select name,max(val) from (
    select name,one as val from t
    union all
    select name,two as val from t
    union all
    select name,three as val from t
) k group by name 
order by val desc 
limit 10 
  1. 使用函数:greatest(求多列最大值),least (求多列最小值)

优点:可以一次性求出多列的最大值,性能也较高

select name, max(val) as vala from (
select name, greatest(one,two,three) as val from t
) k group by name 
order by vala desc 
limit 10 

总结:

两种方式都可以完成任务,但是发现函数效率更好使,主要是两种方式使用场景不一样。行列转换在这种情况下就显得力不从心,所以,不同的场景要求推荐不同的写法。

本文原文来自CSDN

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号