需求场景:
需要利用数据库来实现用户已读公告列表/未读公告列表/全部公告列表

实现思路:
原本的思路是建立一张用户公告关联的表,将所有公告和用户关联起来,然后用状态来判断和修改。但是这样用户一多,比如用户有10000个,每增加一条公告,就要多增加10000条数据,对数据库非常不友好。于是逆向思维,用户每次读取一张公告就判断表中是否有数据,如果没有就在表中插入一条数据。

具体实现:
首先准备两张表,公告表notice以及已读公告表notice_read。

CREATE TABLE `notice` (`id` int(11) NOT NULL AUTO_INCREMENT,`title` varchar(255) DEFAULT NULL COMMENT '公告标题',`introduction` varchar(500) DEFAULT NULL COMMENT '简介',`is_picture` int(2) DEFAULT NULL COMMENT '是否显示主图 0不显示 1显示',`picture` varchar(2000) DEFAULT NULL COMMENT '主图',`content` varchar(5000) DEFAULT NULL COMMENT '内容',`category_id` int(11) DEFAULT NULL COMMENT '栏目id',`is_top` int(2) DEFAULT NULL COMMENT '是否置顶 0否 1是',`is_recommend` int(2) DEFAULT NULL COMMENT '是否推荐到首页 0否 1是',`deleted` int(1) DEFAULT NULL COMMENT '是否删除 0正常 1删除',`create_time` datetime DEFAULT NULL COMMENT '创建时间',`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',`modify_people_id` int(11) DEFAULT NULL COMMENT '修改操作人',`create_people_id` int(11) DEFAULT NULL COMMENT '创建人',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8mb4 COMMENT='公告管理表';
CREATE TABLE `notice_read` (`id` int(11) NOT NULL AUTO_INCREMENT,`user_id` int(11) DEFAULT NULL COMMENT '用户id',`notice_id` int(11) DEFAULT NULL COMMENT '公告id',`modify_people_id` int(11) DEFAULT NULL COMMENT '修改操作人',`create_people_id` int(11) DEFAULT NULL COMMENT '创建人',`create_time` datetime DEFAULT NULL COMMENT '创建时间',`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',`deleted` int(2) DEFAULT '0' COMMENT '是否删除 0正常 1删除',PRIMARY KEY (`id`),UNIQUE KEY `unique_userId_noticeId` (`user_id`,`notice_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COMMENT='用户已读公告表';

在实际查询中,原本想查出利用两表Join然后关联查出已读,然后筛选出未读,最后union,但这种写法不止繁琐,而且对于数据库操作量很大,表中的数据量一旦多效率会很低。 最终希望能一条 SQL,就所有公告列表,同时包含每条公告对于某个用户的已读状态。

SELECT
n.id id,
title,
introduction,
is_picture isPicture,
picture,
content,
category_id categoryId,
is_top isTop,
is_recommend isRecommend,
n.create_time createTime,
//公告id存在当前用户已读记录中,read_flag为1,否则为0
n.id IN (SELECT `notice_id` FROM `notice_read` WHERE `user_id` = 100) AS read_flag
FROM `notice` n
ORDER BY read_flag DESC,n.create_time DESC

最终结果如下:

利用数据库在java实现已读未读消息公告相关推荐

  1. 面试官:群聊消息的已读未读功能,你来设计一个?

    欢迎关注方志朋的博客,回复"666"获面试宝典 一朋友和我讨论他前段时间面试某大公司的一题目 : 企业IM比如企业微信.钉钉里面的群消息的有个已读未读的功能,发送者刚发出消息时,当 ...

  2. 面试题:群聊消息的已读未读设计

    点击上方"Java之间",选择"置顶或者星标" 你关注的就是我关心的! 作者:小猿学习笔记 一朋友和我讨论他前段时间面试某大公司的一题目 : 企业IM比如企业微 ...

  3. Redis实现排行榜、延迟队列、LRU、消息已读未读(Redisson客户端实现)

    目录 序言 Redis客户端选型 Redis配置 Redis实现排行榜 Redis实现延迟队列 Redis LRU(Least Recently Used)使用 Redis实现消息已读未读 总结 序言 ...

  4. Web聊天室消息[已读未读]的实现

    聊天室快速访问 继上次完成聊天室的历史记录功能后,我又想着实现聊天记录的已读未读功能.(轻喷..) 开始之前 首先我看了抖音和钉钉这两款应用的消息已读未读功能的呈现效果.首先是抖音,在聊天界面,给好友 ...

  5. 大公司面试考细节,设计群聊消息的已读未读功能你说说怎么做?

    一朋友和我讨论他前段时间面试某大公司的一题目 : 企业IM比如企业微信.钉钉里面的群消息的有个已读未读的功能,发送者刚发出消息时,当前群里其他群成员都是未读状态,陆陆续续有人看了这个消息,这时候消息的 ...

  6. 群聊消息“已读”/“未读” 功能解决方案!

    一朋友和我讨论他前段时间面试某大公司的一题目: 企业IM比如企业微信.钉钉里面的群消息的有个已读未读的功能,发送者刚发出消息时,当前群里其他群成员都是未读状态,陆陆续续有人看了这个消息,这时候消息的详 ...

  7. Redis 实现热度统计和已读未读功能

    Redis 实现销量统计和已读未读功能 本文主要讨论,通过Redis实现:1. 商品的销量统计.2. 页面内容的已读/未读功能 销量统计 背景 实现统计商品的购买量(热度). 假设有如下商品信息: 要 ...

  8. mysql消息已读未读_Redis实现信息已读未读状态提示

    本文为大家分享了Redis实现信息已读未读状态提示的关键代码,希望可以给大家一些启发,具体内容如下 前提: 假如现在有2个模块需要提示消息:只要存在用户在上个时间点之后没有看过的信息就提示用户有新的信 ...

  9. IM群聊消息的已读未读功能在存储空间方面的实现思路探讨

    1.引言 IM系统中,特别是在企业应用场景下,消息的已读未读状态是一个强需求. 以阿里的钉钉为例,钉钉的产品定位是用于商务交流,其"强制已读回执"功能,让职场人无法再"假 ...

  10. vue+websocket+nodejs实现聊天室 - 消息已读未读

    前言 上一篇讲了聊天室增加一对一单聊,这次讲如何新增已读未读状态. 大概思路: 服务器返回消息列表,增加参数status为1,单聊和群聊通过过滤状态区分对应未读数量,当前聊天,直接在currentMe ...

最新文章

  1. php人员权限管理(RBAC)
  2. 计算机网络与应用测试题,计算机网络技术与应用测试题
  3. C语言中static关键字的作用
  4. Fiori Launchpad server side config json
  5. MFC一一添加WM_USER自定义消息
  6. 人物结局 归德侯府_影视里的唐伯虎抱得美人归 历史上的他结局又是什么样呢?...
  7. android js 子线程,Android学习笔记:Android中的线程:MainThread 和 WorkerThread
  8. python泰坦尼克号数据预测_Python机器学习预测泰坦尼克号乘客生存率(kaggle项目)...
  9. TP-LINK校招系统测试岗面经汇总
  10. 中国银联移动支付技术规范
  11. visio2013-软件UML序列图02
  12. 番茄社区多门店系统介绍
  13. 【Spring】IOC:基于注解的IOC容器初始化源码分析
  14. 打火机与公主裙剧中的爱心
  15. 小程序: getPhoneNumber功能详解,获取手机号登录 2019
  16. 面试题--精选Hadoop选择题
  17. MyBatis01:第一个程序
  18. AWS S3 让IAM用户可以list bucket
  19. 【自学编程】自己写小例子的经验
  20. 二.linux应用网络编程之文件属性

热门文章

  1. 蒜厂年会|计蒜客2019蓝桥杯省赛 B 组模拟赛(一)
  2. opencore 引导 近完美 黑苹果EFI(技嘉H310/I5-9400F/RX560D)
  3. Android Wear和二维码
  4. 为大家介绍两款私藏宝藏可视化大屏制作软件
  5. 【Linux】Linux操作系统简单介绍 ----vim编辑器
  6. 面试常考题——LRU缓存题解
  7. 靶子环数图片_一种靶子环数的图像识别方法与流程
  8. java guardedby_Java多线程基础(五)——Guarded Suspension模式
  9. 2017计算机知识竞赛题,2017年《西游记》知识竞赛试题100题附答案.doc
  10. java.io.IOException: Type mismatch in key from map: expected org.apache.hadoop.io.Text, recieved org