具有用户已读状态功能的公告(2):用户查询公告列表,同时包含读取状态

1 摘要

在上一篇博客中介绍了如何设计一个具有用户已读功能的公告,博客链接如下:
具有用户已读状态功能的公告(1):数据库设计

本以为就是加一个中间表的事,没想到在后续实现具体功能的时候还是遇到了不少的坑?其中就有一个:
当用户查询公告列表的时候,如何在返回结果中包含每一条的读取状态?

2 解决方案

这个问题看似简单,但是实际操作起来还是有些坑的。有人可能会想:
先把所有的公告查出来,然后再去比对比公告用户关联表,如果有记录,则将这一条公告标记为已读,否则就是未读。

这种方案可以实现功能,但是工作量大,首先,你需要查询一次数据库,获取一个公告列表,然后你需要将每一条公告列表放到公告用户关联表中进行查询,这样就会产生大量的数据库查询,对数据库的压力较大,不可取

能否一条 SQL,就可以直接返回公告列表,同时包含每条公告对于某个用户的已读状态?

这么想好像时可以的,那么,怎么写这一条SQL呢?

SQL 查询一:

-- 用户查询公告列表(包含已读状态)
SELECT n.id, nu.read_flag
FROM `notice` n
LEFT JOIN `notice_user` nu ON nu.notice_id = n.id
WHERE n.del_sign = 0 AND nu.user_account_id = 2;

本以为这条SQL就能实现想要的结果,但是已查询却发现只能查询到在公告关联表中有的数据,也就是已读的公告,这不满足要求

SQL 查询二:

SELECT 
    n.id, n.id IN (SELECT `notice_id` FROM `notice_user` WHERE `user_account_id` = 1) AS read_flag
FROM `notice` n

这条SQL可以实现上述功能,查询所有公告,同时返回每一条公告对某个用户的已读状态

总结: 这条SQL符合要求

3 思考

问题: 用户想要一键已读所有公告怎么办?

欲知答案,且看下回分解

具有用户已读状态功能的公告(3):一键已读所有公告

个人公众号:404Code,记录半个互联网人的技术与思考,感兴趣的可以关注.
404Code

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章