消息系统开发:如何统计过去一年未收到回复的主消息数量?
统计过去一年未收到回复的消息数量
咱们先把需求捋清楚:要找的是过去一年发布的、带标题的主消息,而且这些消息完全没有收到任何回复。结合你给出的表结构,我给你两种常用的SQL实现方案,逻辑都很清晰:
方法一:用NOT EXISTS子查询(直观易懂)
这种写法直接瞄准目标主消息,同时确保不存在对应的回复记录:
SELECT COUNT(*) AS unreplied_count FROM messages m WHERE m.related IS NULL -- 判定为带标题的主消息 AND m.title IS NOT NULL -- 严谨过滤主消息特征 AND m.date_time >= DATE_SUB(NOW(), INTERVAL 1 YEAR) -- 限定过去一年的范围 AND NOT EXISTS ( SELECT 1 FROM messages r WHERE r.related = m.id -- 检查是否有回复关联该主消息 );
方法二:用LEFT JOIN + IS NULL(适合复杂关联场景)
通过左连接关联回复消息,筛选出没有匹配到回复的主消息:
SELECT COUNT(DISTINCT m.id) AS unreplied_count FROM messages m LEFT JOIN messages r ON r.related = m.id WHERE m.related IS NULL AND m.title IS NOT NULL AND m.date_time >= DATE_SUB(NOW(), INTERVAL 1 YEAR) AND r.id IS NULL; -- 左连接后无匹配,说明没有回复
小提示
不同数据库的日期函数略有差异:比如PostgreSQL可以把DATE_SUB(NOW(), INTERVAL 1 YEAR)改成NOW() - INTERVAL '1 year',SQL Server用DATEADD(year, -1, GETDATE()),你根据自己用的数据库调整就行。
内容的提问来源于stack exchange,提问作者Martin AJ
相关产品推荐
相关产品推荐

