现在有数据表,保存消息信息,包括消息类型,阅读状态,推送时间等字段,如附件图片。需求是要根据消息类型分组,找出每组最后推送时间,最后推送的消息标题,以及是否有未读信息,未读信息的数量等内容。
获取每种消息类型下最后一条消息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、https://blog.csdn.net/veloi/article/details/62238155