PHP中的通知系统

时间:2015-10-12 23:45:49

标签: php mysql database

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

这是notification

的结构
 Notification

 id 
 user_id
 activity_type   
 source_id  
 created_date   
 created_by     
 updated_date   
 updated_by 

活动类型是字符串,例如“friendrequest”,如果有人接受朋友请求,“签入”是否有人签到某个事件,如果有人创建帖子则“发布”。

现在,无论何时触发任何操作,我都会将数据存储在Notification表中,但我很困惑,我应该如何在列表中显示数据以登录用户。notification中的数据表格会是这样的

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_type一样,source_id会连接到eventcheckingpost表格。那么我应该使用哪个查询来正确显示通知。

我如何控制通知提取,就像任何活动只应显示给用户的朋友一样。

我使用了这个查询,但它无法正常工作

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个不同的查询,有没有其他办法可以做到这一点?

1 个答案:

答案 0 :(得分:1)

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

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

  2. 为3个表创建3个查询,根据activity_type字段将每个源表连接到通知表,并将它们组合在一个联合查询中以获取单个结果集。

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

  4. 仅向朋友显示通知相对容易,所有显示的通知都应由朋友发起。您没有透露好友表的结构,但我猜您有2个与users表user_id字段相关的字段。因此,使用朋友表,您可以按照您显示用户朋友的查询的方式加入通知表。