具有用户已读状态功能的公告(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

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值