MySQL中按条件count
Contents
问题
产品中有个业务是定时发通知的,现有的逻辑是,只有通知数>0时,才会发通知,现在PM说要修改为无论有没有消息数,都要在定时的时间发送通知。
原SQL
SELECT count(1) as total, max(mws.id) as maxRuleStatusId, mwr.user_id as userId, mwr.id as ruleId, mwr.wx_openids as wxOpenIds from micro_warning_status mws INNER JOIN micro_warning_rule as mwr ON mws.micro_warning_rule_id = mwr.id
WHERE mwr.notice_interval = #{noticeInterval} AND mws.id > mwr.last_notice_id
group by mwr.user_id, mwr.id;
last_notice_id:表示上一次已经通知的id,mws.id > mwr.last_notice_id
表示距离上一次通知后,有多少条新的消息.
因为这个条件在where
里,所以只有在定时的时间内,有新的消息时,此SQL才不会为空。
新SQL
因为PM要求无论有没有新消息数,都要进行通知。所以要修改一下SQL,新SQL如下:
SELECT sum(if(mws.id > mwr.last_notice_id, 1, 0)) as total, max(mws.id) as maxRuleStatusId, mwr.user_id as userId, mwr.id as ruleId, mwr.wx_openids as wxOpenIds from micro_warning_status mws INNER JOIN micro_warning_rule as mwr ON mws.micro_warning_rule_id = mwr.id
WHERE mwr.notice_interval = #{noticeInterval}
group by mwr.user_id, mwr.id;
通过sum
+if
来有条件地进行count
操作即可达到目的。