我正在研究一些应用程序,并且我们使用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_all
(deletedAt
字段为空),并且没有字段限制对此用户使用allow = false的访问。
但是好像postgres正在链接所有表达式,所以它在表达式结尾处覆盖privacy."privacyType"='user_all'
和'user'
,并且返回没有结果,或者即使用户“阻塞”也返回数据,因为'user_all'
存在。 有没有办法编写WHERE子句来返回结果,如果AND表达式对于2个不同的行是真实的,例如在上面的代码中:(privacy."privacyType"='user_all' AND privacy."deletedAt" IS NOT NULL)
对于一行是真的,对于其他的是真的,或者可能检查是否存在行值。
您的问题含糊不清。你想要什么?带来'id = 6'的授权吗?把更多的例子与更多的数据和欲望输出 –