具有用戶已讀狀態功能的公告(3):一鍵已讀所有公告

1 摘要

關於公告這一系列的博客:
具有用戶已讀狀態功能的公告(1):數據庫設計

具有用戶已讀狀態功能的公告(2):用戶查詢公告列表,同時包含讀取狀態

在現階段各種手機通知消息漫天飛的情況下,很多APP已經設計了一鍵標記所有消息爲已讀的功能,那麼按照上邊的系統設計,如何實現某個用戶一鍵已讀所有公告?

2 解決方案

方案一

這還不簡單,將所有的公告 id 查詢出來,然後配合用戶標識(id),批量插入到公告用戶關聯表中不就可以了嗎?
什麼?如果公告太多怎麼辦?那就分頁查詢公告 id,然後分批進行批量插入就可以了

這樣做看起來好像可以,但是總感覺很 low
太 low 的方案就不展示代碼實現了

方案二

就一條SQL,將公告表的查詢數據直接插入到公告用戶關聯表中
SQL 展示:

-- 用戶一鍵已讀所有公告
INSERT INTO `notice_user`(`notice_id`, `user_account_id`)
    SELECT n.id notice_id, 2 AS user_account_id 
    FROM `notice` n
    WHERE n.del_sign = 0 AND n.publish_flag = 1

解釋: id 爲 2 的用戶一鍵已讀所有公告

這個方案看起來方便多了,直接甩開方案一好幾條街。
但,好像哪裏不對勁?
這樣的SQL,如果執行兩次,那公告用戶關聯表中豈不是要插入兩次?這就產生了重複的垃圾數據,方案一 也有這個問題。不行,火候還是不夠

方案三

還是一條 SQL,將公告表的查詢數據直接插入到公告用戶關聯表中,同時過濾掉用戶已讀過的公告

SQL 展示:

-- 用戶一鍵已讀所有公告
INSERT INTO `notice_user`(`notice_id`, `user_account_id`)
    SELECT n.id notice_id, 2 AS user_account_id 
    FROM `notice` n
    WHERE n.del_sign = 0 AND n.publish_flag = 1
    AND n.id NOT IN (SELECT `notice_id` FROM `notice_user` WHERE `user_account_id` = 2)

嗯,現在好像沒問題了

這個方案符合要求

3 結論

經測試,方案三可行,

個人公衆號:404Code,記錄半個互聯網人的技術與思考,感興趣的可以關注.
404Code

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