问题

产品中有个业务是定时发通知的,现有的逻辑是,只有通知数>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操作即可达到目的。