Mysql与聚合函数在一起时候,条件和有条件的过滤时机
<强>,在聚合之前过滤强>
当一个查询包含了聚合函数及那里的条件,像这样的情况
选择马克斯(cid)从t t.id<999年
这时候会先进行过滤,然后再聚合。先过滤出ID《999的记录,再查找最大的cid返回。
<强>有在聚合之后过滤强>
有在分组的时候会使用,对分组结果进行过滤,通常里面包含聚合函数。
从应用程序选择ip,马克斯(id) 由ip组 马克斯(id)祝辞=5
先分组,再聚合,然后过滤聚合结果大于等于5的结果集
,是先执行,然后再执行聚合函数具有是在聚合函数执行完之后再执行。
<强>下面是补充强>
有个需求,某张表,有个状态字段(1:成功,2:失败,类似这样的),现要用日期分组统计不同状态下的数量
先写了个子查询
选择aa.logDate aa.totalLogs (从dxp选择计数(1)。dxp_handlermodel aa。logDate=DATE_FORMAT(开始时间”,Y % - % - % d ')和executeStatus pendingLogs=1) (从dxp选择计数(1)。dxp_handlermodel aa。logDate=DATE_FORMAT(开始时间”,Y % - % - % d ')和executeStatus=2) successLogs (从dxp选择计数(1)。dxp_handlermodel aa。logDate=DATE_FORMAT(开始时间”,Y % - % - % d ')和executeStatus errorLogs=3) (从dxp选择计数(1)。dxp_handlermodel aa。logDate=DATE_FORMAT(开始时间”,Y % - % - % d ')和executeStatus=4) callbackErrorLogs 从 ( 选择 DATE_FORMAT (a。开始时间”,Y % - % - % d ') logDate, (1)totalLogs计数 从dxp。dxp_handlermodel一 集团由DATE_FORMAT (a。开始时间”,Y % - % - % d ') )aa
执行相当慢,想到计数中能不能加条件,找了一下,如下:
选择 DATE_FORMAT(开始时间,‘Y % - % - % d’) logDate, (1)totalLogs计数, 数(如果(executeStatus=1,真的,null) pendingLogs, 数(如果(executeStatus=2,真的,null) successLogs, 数(如果(executeStatus=3,真的,null) errorLogs, 数(如果(executeStatus=4,真的,null)) callbackErrorLogs 从dxp.dxp_handlermodel group by DATE_FORMAT(开始时间,‘Y % - % - % d’)
简明易懂,且执行效率非常高
其它的聚合函数也可以用,如求和等其他聚合函数
实战示例:
(如果选择计数(create_date & lt;“2017-01-01”和host_profile_id=9294 d2bf-f457-4fe5-9a36-e5f832310dc2,真的,从profile_visit_log null) ——等同于 (如果选择计数(create_date & lt;“2017-01-01”,的确,null))从profile_visit_log数host_profile_id=?294 d2bf-f457-4fe5-9a36-e5f832310dc2”
好了这篇文章就介绍到这,希望大家以后多多支持。