具有用戶已讀狀態功能的公告(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

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