制作智能通知列表

时间:2012-08-22 13:58:54

标签: php notifications

情景

具有基本功能的图片网站,如上传,评论等,关注用户等。

现在我有一个非常快速构建的基本通知系统,基本上当事件发生时(例如上传或类似情况)插入到notifications表中,然后有一个read列这决定了用户是否看过它,简单。

当前的示例输出将是这样的,

John Doe liked Picture of my cat.
Sarah Doe liked Picture of my cat.
Adam Doe liked Picture of my cat.
Sarah Doe liked Picture of my cat.
Henry Doe is now following you.

基本上按输入时间排序。

现在我想要达到的目标类似于以下内容,

4 users liked Picture of my cat.
Henry Doe is now following you.

我正在努力将我的普通PHP知识包装在这里,我能想到的最好的方法是做这样的事情。

$query = mysql_query("SELECT * FROM `notifications` WHERE `read` = '0' LIMIT 20");
$likes = array();
$following = array();
while($row = mysql_fetch_array($query)){

    if($row['type'] == "like"){

        array_push($likes,$row['id']);

    }   elseif($row['type'] == "following"){

        array_push($following,$row['id']);

    }

}

然后以某种方式对它们进行排序以正确显示。但它似乎仍然很复杂。

另外还有一件事要考虑是否有人提出建议,如果有一个算法就可以将它们分组,即使它们并非直接相继,例如相隔5分钟也是一个好主意中间有不同的通知,例如

John Doe liked Picture of my cat.
John Doe is now following you.
Sarah Doe liked Picture of my cat.
Sarah is now following you.

2 People liked Picture of my cat.
2 New Users are now following you.

2 个答案:

答案 0 :(得分:1)

我认为最好的解决方案是使用GROUP BY中的SQL而不是PHP方。您需要按事件类型对结果进行分组。如果只有一个结果,只需使用第二个查询显示单个结果。如果有多个结果,只需按预期显示COUNT(*)

编辑:示例。

SELECT event_type, COUNT(*) AS count FROM `notifications` WHERE `read` = '0' GROUP BY event_type

result:
event_type  count
----------  -----
4           4
6           2
9           1
12          2

然后,您可以对仅出现一次的事件运行第二次查询。

SELECT * FROM `notifications` WHERE `read` = '0' AND `event_type` = '9'

当然你也应该在最后改变他们的阅读状态

UPDATE `notifications` SET `read` = '1' WHERE `read` = '0'

这些只是快速准备的例子。您应该处理特殊情况,仅更新显示的条目等。

我使用event_type作为字段。我相信你有这样的领域。您应该根据数据库结构重命名该部分。

答案 1 :(得分:0)

从FB中获取示例,无论计数如何,都会处理通知。如果我们点击FB上的喜欢的数量,我们会得到一个喜欢它的人,所以计数只是处理过的物品的占位符。

处理时请保留通知计数

mysql_query("SELECT * FROM `notifications` WHERE `read` = '0' AND 'date_added' > {SOMETIMEEXPRESSION} GROUP BY type LIMIT 20");
while($row = mysql_fetch_array($query)) {
if ($curType != $row['type']) {
    $curType = $row['type'];
    $curCount = 0;
    //Other Type switch conditions
 }
//    do the magic that you wish to do for the type.
}