簡體   English   中英

如何使用MySQL在新聞源中顯示的帖子上應用隱私設置?

[英]How to apply privacy settings on posts the appear in a news feed with MySQL?

我要實現的是一個復雜的隱私例程,我有下表。

帖子

posts_privacy

privacy_global

追隨者

我們網站上有一個新聞提要類的東西,它從用戶關注的人那里獲得10個最新帖子,隱私級別分為3個級別,首先是privacy_global,用戶可以在其帖子上設置隱私選項,0, 1和2分別代表“僅我”,“所有人”和“僅追隨者”,然后有posts_privacy,用戶可以選擇列出要向其顯示或隱藏該帖子的人,然后再發布,此設置將覆蓋privacy_global設置和posts_privacy(如果已設置)。

現在我的問題是,當我使用php在新聞提要中應用隱私時,我基本上會要求這樣的帖子。

SELECT `post`.*,
  `users`.`fullname`,
  `users`.`username`,
  `posts_privacy`.`hide`,
  `posts_privacy`.`show`,
FROM `post`
  LEFT JOIN `posts_privacy` ON `post`.`id`=`posts_privacy`.`postid`
  INNER JOIN `users` ON `post`.`userid` = `users`.`id`
WHERE (`post`.`userid` IN (1,2,3,4,5,6) 
AND 12 NOT IN (
  SELECT `hide` FROM `posts_privacy` WHERE `postid`=`post`.`id`)
  OR `show`= 12
)

 GROUP BY `post`.`id`
 ORDER BY `time` DESC LIMIT 10"

我無法弄清楚如何應用所有其他條件,在此之前,我正在使用另一個查詢並返回需要隱藏或顯示該帖子的人員序列化數組,然后在php中進行非序列化和處理,並將該帖子從數組中刪除在發送到瀏覽器之前,這在新聞提要中造成了一個漏洞,而不是加載10個帖子,而是僅出現6個帖子,因為php刪除了4個具有隱私權的帖子,然后才發布到瀏覽器中,我的目標是做所有帖子離開數據庫之前SQL中的隱私條件,所以我在新聞提要中的帖子數沒有這個問題。

我嘗試研究MySQL函數和過程,但被告知它們無法處理查詢或返回表。

關於如何解決這個問題有什么建議嗎?

編輯:如果有幫助,我嘗試制作的系統與Facebook上的系統類似,用戶可以在其中設置特定於事后的隱私,但也有全局設置,這樣做后會被覆蓋。


表的結構:

關注者列表:

id主鍵大號(20)
userid BIGINT(20)<<單擊關注按鈕的用戶的ID
targetid BIGINT(20)<<被關注用戶的ID

帖子:

id主鍵大號(20)
內容TEXT
標題VARCHAR(100)
時間DATETIME
用戶ID BIGINT(20)

posts_privacy:

id主鍵大號(20)
postid BIGINT(20)
隱藏BIGINT(20)
顯示BIGINT(20)

以下是獲得所需結果的一種方法。 不過,您將需要做一些仔細的測試,因為我已經沒有時間去做進一步的測試了。 它基於查看者(正在請求其有權查看的帖子的用戶)的角度。 它不是完美的,所以請把它當作可以構建的東西。

最終版本中將不需要查詢返回的某些字段,但它們對於測試很方便:

SET @viewerid := 5;
SELECT
  p.id AS post_id,
  owner.id AS owner_id,
  pg.privacy AS privacy_global,
  pp.hide AS hide_from,
  pp.show AS show_to,
  f.userid AS viewer,
  f.targetid AS following
FROM posts AS p
JOIN users AS owner ON owner.id = p.userid
JOIN privacy_global AS pg ON pg.postid = p.id
LEFT JOIN posts_privacy AS pp ON pp.postid = p.id
LEFT JOIN followerlist AS f ON f.userid = @viewerid
WHERE ((pg.privacy = 0 AND pp.show = @viewerid)
OR (pg.privacy = 1)
OR (pg.privacy = 2 AND f.targetid = p.userid))
AND ((pp.hide != @viewerid OR pp.hide IS NULL)
AND (p.userid != @viewerid))
GROUP BY p.id
LIMIT 10;

在測試期間,您可能會發現分解查詢很有用。 以下塊列出了帖子ID,帖子所有者,全局隱私設置以及“隱藏/顯示到”用戶ID:

SELECT
  p.id AS post_id,
  owner.id AS owner_id,
  pg.privacy AS privacy_global,
  pp.hide AS hide_from,
  pp.show AS show_to
FROM posts AS p
JOIN users AS owner ON owner.id = p.userid
JOIN privacy_global AS pg ON pg.postid = p.id
LEFT JOIN posts_privacy AS pp ON pp.postid = p.id

添加查看者用戶ID,查看者將跟隨該帖子的所有者的每個帖子顯示額外的行:

SET @viewerid := 1;
SELECT
  p.id AS post_id,
  owner.id AS owner_id,
  pg.privacy AS privacy_global,
  pp.hide AS hide_from,
  pp.show AS show_to,
  f.userid AS viewer,
  f.targetid AS following
FROM posts AS p
JOIN users AS owner ON owner.id = p.userid
JOIN privacy_global AS pg ON pg.postid = p.id
LEFT JOIN posts_privacy AS pp ON pp.postid = p.id
LEFT JOIN followerlist AS f ON f.userid = @viewerid;

然后, WHERE子句根據每個帖子和全局隱私設置繼續縮小這些結果的范圍。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM