如何在Feed中对通知进行分组

时间:2015-01-13 11:37:37

标签: php mysql

我正在实施一个Feed,其中一些通知应该作为一个组显示(即用户发布了对您的视频的评论),其他通知作为独立通知(您的视频本周推出)。 突出显示新通知也是一项要求

对于分组通知,当用户查阅他的Feed时,该条目应该类似于

Joe and other 5 posted a comment on your video "Cooking with fire"

问题是如何在通知交错时对事件进行分组。

在示例中,假设以下日志:

 1 min ago           Joe posted comment on video 1
 10 mins ago         Video 1 featured
 11 mins ago         Helen posted comment on video 1
 11 mins ago         Michael posted comment on video 1
 14 mins ago         David posted comment on video 1
 14 mins ago         Robert posted comment on video 1

饲料可分为几种方式。即使是新通知也可能会改变突破重点的群组。

在哪里可以阅读有关此问题的常见解决方案以及如何存储和返回我的网络服务通知的更多信息?

1 个答案:

答案 0 :(得分:0)

就个人而言,我会精确记录通知时间,然后执行类似的操作(我没有测试过这些特定的解决方案,但之前已做过类似的事情):

如果您希望通知按日期分组

SELECT about_resource_id,DATE(notification_time) AS notification_date,COUNT(*) FROM notification_tbl GROUP BY about_resource_id,DATE(notification_time);

按小时(细分边界相对于当前时间),您可以这样做:

SELECT 
    about_resource_id,
    TIMESTAMPDIFF(HOUR,NOW(),notification_time) AS hours_ago,
    COUNT(*) 
FROM notification_tbl 
GROUP BY about_resource_id,TIMESTAMPDIFF(HOUR,NOW(),notification_time);

对于以其他方式分组的通知,我会在GROUP BY子句中编写一个合适的公式。

为了说明上次评论的人,我会做这样的事情:

SELECT 
    about_resource_id,
    DATE(notification_time) AS notification_date,
    SUBSTRING_INDEX(GROUP_CONCAT(counterparty_id,";"),";",1) AS last_commenter_id,
    COUNT(*) AS commenters 
FROM notification_tbl 
GROUP BY 
    about_resource_id,
    DATE(notification_time) 
ORDER BY notification_time DESC;

我在这里使用了MySQL特定的GROUP_CONCAT()函数,字符串函数SUBSTRING_INDEX:Some alternative techniques for solving this problem with a JOIN/aggregate可能很难完善,因为MySQL apparently does not support LIMIT within a subquery。您可能需要考虑commenter_id,commenter_name或等效字段的格式;在适应我的解决方案时。