我正在构建一个与社交网络相同的响应式网站
我有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
会连接到event
,checking
或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个不同的查询,有没有其他办法可以做到这一点?
答案 0 :(得分:1)
由于source_id字段可能链接到3个表中的一个,您可以
使用左连接使用source_id字段在通知表上连接这3个表。根据activity_type,您可以决定在应用程序代码中从结果集中显示哪些字段。缺点:如果所有3个表中都出现相同的ID,则查询将提取不必要的数据。
为3个表创建3个查询,根据activity_type字段将每个源表连接到通知表,并将它们组合在一个联合查询中以获取单个结果集。
根据3个源表的内容,您可以选择反规范化并在通知表中包含事件的详细信息,因此您不必加入源表。例如,如果sy成为另一个人的朋友,那么您可以在通知表中明确存储朋友的姓名。
仅向朋友显示通知相对容易,所有显示的通知都应由朋友发起。您没有透露好友表的结构,但我猜您有2个与users表user_id字段相关的字段。因此,使用朋友表,您可以按照您显示用户朋友的查询的方式加入通知表。