admin管理员组

文章数量:821309

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

Refer:

1、

本文标签: mysql分组后按条件统计