Mysql-分组按条件统计

 

    现在有数据表,保存消息信息,包括消息类型,阅读状态,推送时间等字段,如附件图片。需求是要根据消息类型分组,找出每组最后推送时间,最后推送的消息标题,以及是否有未读信息,未读信息的数量等内容。

    获取每种消息类型下最后一条消息pusher_time和msg_title我使用了先将消息倒序排列,外层sql根据消息类型进行分组的方法。统计当前消息类型下是否有未读消息,我是先将所有消息的is_read状态concat,然后判断concat的字符串中是否包含有0(is_read 未读状态),如果有说明这种类型下有未读的消息。统计每种类型下的未读消息数量了使用了COUNT(CASE  WHEN t.is_read = 0 THEN t.msg_type END) AS unReadMsgCount,其中msg_type是消息类型,根据此字段分组。

 

最终sql:

SELECT t.* , 
CASE FIND_IN_SET('0', GROUP_CONCAT(is_read)) WHEN 0 THEN 0 ELSE 1 END AS hasUnRead, 
COUNT(CASE  WHEN t.is_read = 0 THEN t.msg_type END) AS unReadMsgCount 
FROM ( 
    SELECT id, push_time, msg_type, is_read, msg_title FROM table_name WHERE user_id = ***** 
    ORDER BY push_time DESC ) t 
GROUP BY msg_type ORDER BY msg_type ASC

 

Mysql-分组按条件统计

 

Refer:

1、https://blog.****.net/veloi/article/details/62238155