2

设想

具有上传、评​​论、点赞、关注用户等基本功能的图片网站。

现在我有一个基本的通知系统,我很快就建立了它,基本上当一个事件发生时,比如上传或喜欢它被插入到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.
4

2 回答 2

1

我相信最好的解决方案是使用GROUP BYin SQLnot at PHPside。您需要按事件类型对结果进行分组。如果只有一个结果,只需使用第二个查询显示单个结果。如果有多个结果,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一个字段。我相信你有这样的领域。您应该根据您的数据库结构重命名该部分。

于 2012-08-22T14:03:07.157 回答
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.
}
于 2012-08-22T14:11:48.713 回答