我正在构建一个与社交网络相同的响应式网站
我有 4 张 table checkin
friend
post
notification
这是 notification
的结构表格
Notification
id
user_id
activity_type
source_id
created_date
created_by
updated_date
updated_by
其中事件类型是一个字符串,例如“friendrequest”(如果有人接受 friend 请求),“checkin”(如果有人签到某个事件)和“post”(如果有人创建帖子)。
现在我将数据存储在 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
将连接到 event
中的任一个, checking
或 post
table 。那么我应该使用哪个查询来正确显示通知。
我如何控制通知获取,比如任何事件都应该只显示给用户的 friend 。
我使用了这个查询,但它不能正常工作
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 个不同查询的情况下以其他方式做到这一点?
最佳答案
由于 source_id 字段可能链接到 3 个表之一,您可以选择
使用左连接,使用 source_id 字段连接通知表上的这 3 个表。根据 activity_type,您可以决定在应用程序代码的结果集中显示哪些字段。缺点:如果所有 3 个表中出现相同的 id,则查询将拉取不必要的数据。
为 3 个表创建 3 个查询,根据 activity_type 字段将每个源表连接到通知表,并将它们合并到一个联合查询中以获得单个结果集。
根据 3 个源表的内容,您可以选择非规范化并将事件的详细信息包含在通知表中,这样您就不必连接到源表。例如,如果 sy 成为另一个人的 friend ,那么您可以在通知表中显式存储 friend 的名字。
仅向好友显示通知相对容易,显示的所有通知都应由好友发起。您没有透露 friend 表的结构,但我猜您有 2 个与用户表 user_id 字段相关的字段。因此,使用您在内部加入通知表的 friend 表,就像您在显示用户 friend 的查询中所做的那样。
关于php - PHP中的通知系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33091928/