【问题标题】:Nested MySQL query for multiple privacy check用于多重隐私检查的嵌套 MySQL 查询
【发布时间】:2015-09-02 21:42:00
【问题描述】:

我有 1 个带有 useridposttypeidprivacyoriginalpostid 的表帖

隐私可以是 1(所有人)、2(朋友)、3(朋友和追随者)、4(只有我)

用户可以分享任何用户帖子,但访问他们墙的人可以根据原始帖子的useridcurrentuser 之间的隐私查看帖子

我也有返回useruser2 之间关系的函数,但在这种情况下,使用 mysql 单查询如何有条件地处理。

例如查询返回 10 个结果,其中 4 个是共享帖子,现在我必须检查每个帖子,如果用户隐私为 1,那么它应该对所有人可见,如果 2,那么原始帖子所有者的朋友只能像这样看到

我已经弄清楚了一些情况,比如

IF(originalpostid!=0,(privacy=1,true,(privacy=2,(ORIGINAL_POST_QUERY & then check if SUBQUERY_TO_RETURN_IF_USER_IS_FRIEND_OR_NOT),(privacy=3,(ORIGINAL_POST_QUERY & then check if SUBQUERY_TO_RETURN_IF_USER_IS_FRIEND_OR_FOLLOWER),(privacy=4,(ORIGINAL_POST_QUERY & then check if CHECK_IF_CURRENTUSER_AND_ORIGINALPOSTID_USERID_IS_SAME),true)))),true)

这个有点乱,而且在这种情况下,我必须一直运行子查询以获取原始帖子详细信息以比较用户 ID 是否有任何简单的解决方案?

【问题讨论】:

  • 我建议每次,用户访问用户的网站,然后加载他应该看到的所有帖子,样式如下:SELECT posts WHERE privacy
  • 不,在这种情况下,这不是解决方案,您需要 2 个变量用户和访问者,但在我的情况下,只有访问者可供我和用户使用,我必须从每个结果中获取并获取用户 ID来自 originalpostid 记录
  • 你的 get_relation 函数返回什么?也许是这样的?从用户 u 中选择 p.posts,帖子 p。 WHERE p.privacy - get_relations(visitorId, (Select userid from users where userId = p.orginalpostId))
  • 它返回 2 个用户之间的状态,比如如果你和我是朋友,那么如果我们是未知的,它将返回 1,2,如果你是追随者和朋友,则返回 1,然后返回 1,2,3,如果它我自己然后 1,2,3,4
  • 如果我出错了,我很抱歉,但是如果函数返回这些值,我上面的评论应该可以使用 MAX()。 (当然这不是实际代码,而是隐私原则 - MAX(get_relations(visitorId, (SELECT userId WITH orginalpostid ))

标签: php mysql


【解决方案1】:

如果我理解正确,这样的查询就可以了:-

SELECT Post.PostID 
FROM Post 
WHERE Post.StatusID=2 
AND Post.privacy = 1
UNION
SELECT Post.PostID 
FROM Post 
INNER JOIN relationship
ON Post.userid = relationship.userid
WHERE Post.StatusID=2 
AND relationship.status = 2
AND relationship.userid_other = $CurrentUser
AND Post.privacy = 2
UNION 
SELECT Post.PostID 
FROM Post 
INNER JOIN relationship
ON Post.userid = relationship.userid
WHERE Post.StatusID=2 
AND relationship.status = 1
AND relationship.userid_other = $CurrentUser
AND Post.privacy = 3
UNION 
SELECT Post.PostID 
FROM Post 
WHERE Post.StatusID=2 
AND Post.userid = $CurrentUser

假设这样的关系表:-

CREATE TABLE relationship
(
    userid  INT,
    userid_other    INT,
    status  INT
);

status = 1 for follower, 2 for friend

这是 4 个联合查询(联合将排除重复项)。查询首先获取针对所有人的帖子,第二个针对当前用户是发布者的朋友的朋友的帖子,第三个获取针对当前用户是发布者的关注者的关注者的帖子,第四个获取任何人都可以阅读的帖子。

但为了提供更好的东西,我需要知道你的关系是如何存储的。

【讨论】:

  • 有 2 个不同的表供朋友和关注者使用,但是是的,您的查询可以帮助我创建实际的工作查询,我的意思是我可以从中得到想法 :)
猜你喜欢
  • 1970-01-01
  • 2014-04-11
  • 1970-01-01
  • 2014-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-16
  • 1970-01-01
相关资源
最近更新 更多