2011-03-23 79 views
0

我正在为CMS构建消息传递系统,并且无法找到获取消息链中未读消息数量的方法。SQL显示未读消息的数量...包括未读回复

我需要一种方法来确定主消息或它的任何回复消息是否未读。

我有一个所谓的 “信息” 表具有以下字段: ID,活性[1,0],主题,消息,日期时间,user_from,user_to,回复,查看,删除

当消息读我存储在观看现场用户ID逗号分隔: ,3,4,12,

然后找出它是否看到我找发件人ID是这样的:

m.viewed LIKE '%,$user_id,%' 

我只是想出如何克将该逻辑转换为此SQL选择,以便我可以查看是否应将父消息标记为未读。以下SQL可以很好地工作并抓取所有消息和回复的数量,并按日期时间对它们进行排序。

SELECT m.*, COUNT(*) AS num_replies, MAX(r.datetime) AS max_datetimeunread_replies 
FROM directus_messages AS m 
LEFT JOIN directus_messages as r 
    ON m.id = r.reply 
WHERE m.active = '1' 
AND m.removed NOT LIKE '%,$user_id,%' 
GROUP BY m.id 
HAVING m.reply = '0' 
ORDER BY datetime DESC, max_datetime DESC 

任何帮助将不胜感激......我不能包围我的头!

+0

检查这个类似的问题:http://stackoverflow.com/questions/4318010/print-hierachical-data-in-a-parent-child-form-unordered-list- php/4318846#4318846 – 2011-03-23 07:59:36

+0

旁边的问题:“查看”和“删除”字段有多长?当超过100个用户查看消息时会发生什么?你应该尝试使用逗号分隔的字段来标准化表格。 – 2011-03-23 08:01:31

+0

另外这个问题:http://stackoverflow.com/questions/5291054/hierarchical-sql-problem – 2011-03-23 08:10:49

回答

1

您应该检查这篇文章:Managing Hierarchical Data in MySQL

- 编辑 - UPDATE

OK,你只有1级的答复因此没有必要对上述。

试试这个:

SELECT m.* 
    , COUNT(*) AS num_replies 
    , MAX(r.datetime) AS max_datetime 
    , (m.viewed LIKE '%,$user_id,%') 
     AS message_viewed --shows True or False 
    , SUM(r.viewed NOT LIKE '%,$user_id,%') 
     AS unread_replies --shows number of unread replies 
FROM directus_messages AS m 
    LEFT JOIN directus_messages as r 
    ON m.id = r.reply 
WHERE m.active = '1' 
    AND m.removed NOT LIKE '%,$user_id,%' 
GROUP BY m.id 
HAVING m.reply = '0' 
ORDER BY m.datetime DESC 
     , max_datetime DESC 
; 
+0

@ypercube我忘了解释,每条消息只有一个级别的回复...有消息和对这些消息的回复。您无法回复答复。 – RANGER 2011-03-23 08:33:32

+0

好吧,我误解了“消息链”。 – 2011-03-23 08:39:53

+0

基于这种简化结构的进一步建议?我看到增加另一张表来跟踪谁看过一条消息使事情变得复杂。查看消息是否被查看的SQL很简单...我只需要一种方法将它合并到我现有的SELECT中。 – RANGER 2011-03-23 21:37:29