MySql 中聚合函数增加条件表达式的方法

 更新时间:2018年06月15日 15:39:23   投稿:mdxy-dxy  
这篇文章主要介绍了MySql 中聚合函数增加条件表达式的方法,需要的朋友可以参考下

Mysql 与聚合函数在一起时候where条件和having条件的过滤时机

where 在聚合之前过滤

当一个查询包含了聚合函数及where条件,像这样的情况
select max(cid) from t where t.id<999
这时候会先进行过滤,然后再聚合。先过滤出ID《999的记录,再查找最大的cid返回。

having 在聚合之后过滤

having在分组的时候会使用,对分组结果进行过滤,通常里面包含聚合函数。

SELECT ip,MAX(id) FROM app
GROUP BY ip
HAVING MAX(id)>=5 

先分组,再聚合,然后过滤聚合结果大于等于5的结果集

二者的区别:

where是先执行,然后再执行聚合函数。having是在聚合函数执行完之后再执行。

下面是补充

有个需求,某张表,有个状态字段(1:成功,2:失败,类似这样的),现要用日期分组统计不同状态下的数量

先写了个子查询

select aa.logDate,aa.totalLogs 
 ,(select count(1) from dxp.dxp_handlermodel where aa.logDate=DATE_FORMAT( startTime, '%Y-%m-%d') and executeStatus=1) pendingLogs
 ,(select count(1) from dxp.dxp_handlermodel where aa.logDate=DATE_FORMAT( startTime, '%Y-%m-%d') and executeStatus=2) successLogs
 ,(select count(1) from dxp.dxp_handlermodel where aa.logDate=DATE_FORMAT( startTime, '%Y-%m-%d') and executeStatus=3) errorLogs
 ,(select count(1) from dxp.dxp_handlermodel where aa.logDate=DATE_FORMAT( startTime, '%Y-%m-%d') and executeStatus=4) callbackErrorLogs
from
(
 select
 DATE_FORMAT( a.startTime, '%Y-%m-%d') logDate,
 count(1) totalLogs
 from dxp.dxp_handlermodel a 
 group by DATE_FORMAT( a.startTime, '%Y-%m-%d') 
) aa

执行相当慢,想到count中能不能加条件,找了一下,如下:

select
DATE_FORMAT( startTime, '%Y-%m-%d') logDate,
 count(1) totalLogs,
 count(if(executeStatus=1,true,null)) pendingLogs,
 count(if(executeStatus=2,true,null)) successLogs,
 count(if(executeStatus=3,true,null)) errorLogs,
 count(if(executeStatus=4,true,null)) callbackErrorLogs
from dxp.dxp_handlermodel
group by DATE_FORMAT( startTime, '%Y-%m-%d')

简明易懂,且执行效率非常高

其它的聚合函数也可以用,如SUM等其他聚合函数

实战示例:

select count(if(create_date < '2017-01-01' and host_profile_id = '9294d2bf-f457-4fe5-9a36-e5f832310dc2',true,null)) from profile_visit_log 
-- 等同于 
select count(if(create_date < '2017-01-01',true,null)) count from profile_visit_log where host_profile_id = '9294d2bf-f457-4fe5-9a36-e5f832310dc2'

好了这篇文章就介绍到这,希望大家以后多多支持脚本之家。

相关文章

  • Mysql提升索引效率优化的八种方法总结

    Mysql提升索引效率优化的八种方法总结

    索引实际上也是一张表,保存了主键和索引的字段,并且指向实体表的记录,所以索引也是需要占用空间的,这篇文章主要给大家介绍了关于Mysql提升索引效率优化的八种方法,需要的朋友可以参考下
    2024-04-04
  • MySql 错误Incorrect string value for column

    MySql 错误Incorrect string value for column

    能使用中文进行搜索,但是insert into 中文是可以的。我的数据库和数据表中所有的charset都是设置的utf8。
    2010-12-12
  • 使用YUM在Linux(CentOS 7)下安装mysql 5.7.18的教程详解

    使用YUM在Linux(CentOS 7)下安装mysql 5.7.18的教程详解

    这篇文章主要介绍了使用YUM在Linux(CentOS 7)下安装mysql 5.7.18的教程详解,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-05-05
  • Mysql 建库建表技巧分享

    Mysql 建库建表技巧分享

    本文中说到的“建”,并非单纯的建一个库,或是建一张表,而是你建好的库和表在项目的运营中,是否能应付各种事件,下面我说说几个我在项目中遇到的问题以及处理的方法,算是一个小小的心得,给大家分享下。
    2011-07-07
  • mybatis分页插件pageHelper详解及简单实例

    mybatis分页插件pageHelper详解及简单实例

    这篇文章主要介绍了mybatis分页插件pageHelper详解及简单实例的相关资料,需要的朋友可以参考下
    2017-05-05
  • 一文教你快速学会使用DDL对数据库和表的操作

    一文教你快速学会使用DDL对数据库和表的操作

    SQL是一种操作关系型数据库的结构化查询语言,今天这篇文章将详细讲述数据定义语言DDL对数据库和表的相关操作,有感兴趣的同学跟着小编一起来学习吧
    2023-07-07
  • Mysql中校对集utf8_unicode_ci与utf8_general_ci的区别说明

    Mysql中校对集utf8_unicode_ci与utf8_general_ci的区别说明

    一直对utf8_unicode_ci与utf8_general_ci这2个校对集很迷惑,今天查了手册有了点眉目。不过对中文字符集来说采用utf8_unicode_ci与utf8_general_ci时有何区别还是不清楚
    2012-03-03
  • Mysql索引分类及其使用实例详解

    Mysql索引分类及其使用实例详解

    数据库的索引就像一本书的目录,能够加快数据库的查询速度,MYSQL索引有四种PRIMARY、INDEX、UNIQUE、FULLTEXT, 其中PRIMARY、INDEX、UNIQUE是一类,FULLTEXT是一类,本文给大家介绍Mysql索引分类及其使用实例,感兴趣的朋友一起看看吧
    2022-07-07
  • mysql 队列 实现并发读

    mysql 队列 实现并发读

    队列是常用的数据结构,基本特点就是先入先出,在事务处理等方面都要用到它,有的时候是带有优先级的队列。当队列存在并发访问的时候,比如多线程情况下,就需要锁机制来保证队列中的同一个元素不被多次获取
    2012-04-04
  • MySQL中EXPLAIN的/基本使用及字段详解

    MySQL中EXPLAIN的/基本使用及字段详解

    EXPLAIN命令是MySQL中用于解析SQL查询语句的工具,帮助开发者理解MySQL如何执行SQL语句,通过EXPLAIN可以查看SQL执行的详细信息,如表的读取顺序、使用的索引、数据读取操作的类型等,这篇文章主要介绍了MySQL中EXPLAIN的/基本使用及字段详解,需要的朋友可以参考下
    2024-09-09

最新评论