gpt4 book ai didi

Postgresql 查询结果依赖于同一表的几行

转载 作者:行者123 更新时间:2023-11-29 13:54:44 24 4
gpt4 key购买 nike

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

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)
);

我知道这个查询在这种形式下是不正确的,但我希望您了解我试图实现的目标。
因此它必须检查其类型/id 和 allow=true 的字段,或者检查 user_all 是否未被删除(deletedAt 字段为空)并且没有字段限制此用户使用 allow=false 进行访问。
但似乎 postgres 正在链接所有表达式,因此它在表达式末尾用 'user' 覆盖 privacy."privacyType"='user_all' ,并且不返回任何结果,或者即使用户“被阻止”也返回数据,因为 'user_all' 存在。如果 AND 表达式对于 2 个不同的行为真,是否可以编写 WHERE 子句返回结果,例如在上面的代码中:(privacy."privacyType"='user_all' AND privacy."deletedAt"IS NOT NULL) 对于一行 AND (privacy."privacyType"='user' AND privacy."privacyId"=6 AND privacy.allow!=false) 对于其他行也是如此,或者也许检查是否缺少具有此值的行。

最佳答案

这是你想要的吗?

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';

关于Postgresql 查询结果依赖于同一表的几行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34397871/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com