2015-12-21 81 views
1

我正在研究一些应用程序,并且我们使用postgres作为我们的数据库。我根本没有很多SQL经验,现在我遇到了一个问题,我找不到答案。
所以这里有一个问题:
我们有隐私设置存储在单独的表中,每行数据的可访问性取决于此隐私表的几行。
基本上隐私表的结构是:Postgresql查询结果取决于同一表的几行

entityId | entityType | privacyId | privacyType | allow | deletedAt 
------------------------------------------------------------------- 
5  | user  | 6  | user  | f |   //example entry 
5  | user  | 1  | user_all | t | 

两个词,这意味着设置,用户ID5允许访问他的数据给大家,除了用户ID6。 所以我喜欢通过查询获取可用的数据:

SELECT <some_relevant_fields> FROM <table> 
JOIN <join> 
WHERE 
    (privacy."privacyId"=6 AND privacy."privacyType"='user' AND privacy.allow=true) 
    OR (
    (privacy."privacyType"='user_all' AND privacy."deletedAt" IS NOT NULL) 
    AND 
    (privacy."privacyType"='user' AND privacy."privacyId"=6 AND privacy.allow!=false) 
); 

我知道,这个查询是不正确以这种形式,但我希望你能得到什么,我试图实现的想法。
因此,它必须检查其类型/编号为allow=true的字段,或检查是否未删除user_alldeletedAt字段为空),并且没有字段限制对此用户使用allow = false的访问。
但是好像postgres正在链接所有表达式,所以它在表达式结尾处覆盖privacy."privacyType"='user_all''user',并且返回没有结果,或者即使用户“阻塞”也返回数据,因为'user_all'存在。 有没有办法编写WHERE子句来返回结果,如果AND表达式对于2个不同的行是真实的,例如在上面的代码中:(privacy."privacyType"='user_all' AND privacy."deletedAt" IS NOT NULL)对于一行是真的,对于其他的是真的,或者可能检查是否存在行值。

+0

您的问题含糊不清。你想要什么?带来'id = 6'的授权吗?把更多的例子与更多的数据和欲望输出 –

回答

0

这是你想要的吗?

select <some_fields> from <table> where 
privacyType='user_all' AND deletedAt IS NOT NULL 
union 
select <some_fields> from <table> where 
privacyType='user' AND privacyId=6 AND allow<>'f'; 
+0

这不完全是正确的答案,但你把我推向了正确的方向,谢谢! –

0

left join与自己的表,发现哪些因素不必须使用where匹配。

SELECT p1.* 
FROM privacy p1 
LEFT JOIN privacy p2 
     ON p1."entityId" = p2."entityId" 
     AND p1."privacyType" = 'user_all' 
     AND p1."deletedAt" IS NULL 
     AND p2."privacyType"='user' AND 
     AND p2."privacyId"= 6 
     AND p2.allow!=false 
WHERE 
    p2.privacyId IS NOT NULL 
相关问题