PHP中的通知系统

3

我正在建设一个与社交网络相同的响应式网站,我有4个表 checkin friend post notification

这是notification表的结构:

 Notification

 id 
 user_id
 activity_type   
 source_id  
 created_date   
 created_by     
 updated_date   
 updated_by 

活动类型是一个字符串,比如,“friendrequest”表示有人接受了好友请求,“checkin”表示有人签到参加某个事件,“post”表示有人发表了帖子。

现在每当这些操作中任何一个被触发时,我都会将数据存储在“通知”表中,但我不确定应该如何将数据显示在已登录用户的列表中。在“通知”表中的数据如下:

id  user_id activity_type source_id created_date  
5   1       friend        488       2015-10-13   
6   48      checkin       10        2015-10-13   
7   1       checkin       9         2015-10-13   
8   9       friend        7         2015-10-13   
9   1       checkin       27        2015-10-13   
10  48      post          18        2015-10-13  
11  9       checkin       8         2015-10-13  

根据 activity_typesource_id 将连接到 eventchecking 或者 post 表。那么我应该使用哪个查询来正确地显示通知。
另外,我如何控制通知的获取,比如只向用户的好友显示任何活动。
我使用了这个查询,但它没有正常工作。
SELECT
    group_concat(`user_id`) as 'users',
    `activity_type`,
    `source_id` as 'post'
FROM
    `notification`
WHERE
    `source_id` IN ("488") 
GROUP BY
    `source_id`,
    `activity_type` 
ORDER BY
    `source_id` 

如果有在线的示例项目,请告诉我。根据我在这里得到的答案,我写了这个查询语句。如果还有其他改进的方式,请让我知道。

 SELECT 
      notification.*,event.title 
 FROM 
      notification 
 INNER JOIN 
      event 
 ON 
      event.id = notification.source_id 
 AND 
      notification.activity_type = "checkin"
 WHERE
      notification.user_id in (488,489) 
 UNION 
 SELECT 
      notification.*,user.firstname FROM notification 
 INNER JOIN 
      user 
 ON 
      user.id = notification.source_id 
 AND 
      notification.activity_type = "friend"
 WHERE
      notification.user_id in (488,489) 

我应该怎么做才能找到已登录用户的朋友? 我需要写另一个查询吗?

Select friend_id from friend where user_id=1

保存id数组并将其传递给上面的notification查询,有没有其他方法可以不写2个不同的查询来完成这个任务?


你如何知道用户是否已查看通知?通常会有一个名为“is_read”的列,其中包含0/1,以便您只获取“WHERE is_read = 1”等已读通知。 - Darren
我实际上会有一张表,存储阅读过该帖子的所有人。 - Itay Moav -Malimovka
@Darren,实际上我并不担心用户是否已经阅读了它,我有一个单独的表notification_read来跟踪它是否已读,并且我会在其中插入数据以追踪其是否已读... - Mike Ross
1个回答

1

由于source_id字段可能链接到3个表中的一个,您可以选择:

  1. 使用左连接将这3个表与通知表连接,使用source_id字段。根据活动类型,您可以决定从结果集中在应用程序代码中显示哪些字段。缺点:如果相同的ID出现在所有3个表中,则查询将提取不必要的数据。

  2. 为3个表创建3个查询,其中每个源表基于activity_type字段将其加入到通知表中,并将它们合并在联合查询中以获取单个结果集。

  3. 根据3个源表的内容,您可以选择去规范化并在通知表中包含事件的详细信息,因此您不必加入源表。例如,如果sy成为另一个人的朋友,则可以在通知表中明确存储该朋友的姓名。

仅向朋友显示通知相对容易,所有显示的通知都应由朋友发起。您没有透露朋友表的结构,但我猜您有2个与用户表user_id字段相关的字段。因此,使用朋友表,您可以像为显示用户的朋友的查询一样内部连接通知表。


谢谢您的回复,我现在比之前清楚了一点,但是我对您的第二个和第三个选项之间哪个更快、更好用还是有些困惑,哪个会更快呢? - Mike Ross
好的,谢谢您... 如果有类似的在线示例,请在您的答案中包含链接。 - Mike Ross
我已经更新了我的问题并包含了一个查询,请告诉我您对此的想法,以及是否可以进行任何改进。 - Mike Ross
在左连接查询中,将 notification.activity_type = "checkin" 的 AND 语句排除在外。你已经实现了我的第一个建议,所以我真诚地希望你的源表中没有太多的公共 ID。 - Shadow
实际上我有常见的ID...但是我不理解你的第二个建议,所以你能否给我一个例子,我会根据我的表格来实现它。 - Mike Ross
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接