Php 制作智能通知列表

Php 制作智能通知列表,php,notifications,Php,Notifications,场景 一个具有上传、评论、跟踪用户等基本功能的图像网站 现在我有了一个基本的通知系统,我很快就建立了这个系统,当一个事件发生时,比如上传或者类似的事件被插入通知表,然后有一个读取列来确定用户是否看到它,很简单 当前的示例输出如下所示 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

场景

一个具有上传、评论、跟踪用户等基本功能的图像网站

现在我有了一个基本的通知系统,我很快就建立了这个系统,当一个事件发生时,比如上传或者类似的事件被插入
通知
表,然后有一个
读取
列来确定用户是否看到它,很简单

当前的示例输出如下所示

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.
进入


我认为最好的解决方案是在
SQL
中使用
groupby
,而不是在
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'
这些只是快速准备的例子。您应该注意特殊情况,只更新显示的条目等


我使用了
事件类型
作为字段。我相信你有这样一个领域。您应该根据数据库结构重命名该部分。

以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.
}

请不要使用
mysql.*
函数来编写新代码。它们不再得到维护,社区已经开始。看到了吗?相反,你应该学习并使用或。如果你不能决定哪一个,我会帮你的。如果你选择PDO,好的,谢谢。对我的问题有什么看法吗?这只是一个友好的评论。如果你想创建一个类似facebook的网站,你需要良好的数据库知识和php知识。如果这是一个针对有限用户的小项目,没问题,您可以通过在这里提问了解您需要什么。但是如果你的项目要更大,你应该学习更多关于SQL的知识,它根本不会是一个类似facebook的网站。唯一的相似之处是用户可以上传照片。但是谢谢你的建议。我刚才也在写这个答案,分组依据是你问题的解决方案+1但是我如何确定分组依据的时间范围,依据?更新通知条目中的“读取”标志:-)编辑:无论如何,您必须确定用户是否至少尚未读取一个条目,然后使用所有条目。对于日期函数,您可以使用MIN()MAX()。如果您想按不同的时间范围分组,您可以使用附加参数按分组中的特殊日期案例分组,或者在sql的WHERE部分丢弃不需要的日期。我不太明白,恐怕您介意编写一段示例代码吗?但这如何处理多个喜欢的图像,例如,未读的通知在一个图像上有4个喜欢,在另一个图像上有2个喜欢,在另一个图像上有一个喜欢,并且有3个人跟随?您可以添加GROUP BY子句。
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.
}