postgreSQL - 如何对加入模型结果有条件
Posted
技术标签:
【中文标题】postgreSQL - 如何对加入模型结果有条件【英文标题】:postgreSQL - How to have condition on Join model result 【发布时间】:2021-03-27 08:37:15 【问题描述】:我一直在努力研究如何将我的业务需求转换为 SQL 查询。
案件本身并不复杂。我有两个主表 user
和 list
以及它们之间的多对多关系通过 userList
表,其中用户可以通过具有特定角色(例如成为所有者或合作者。
该示例的相关属性:
user -> id
list -> id | isPublic (BOOL)
userList -> id | userId | listId | role (OWNER|COLLABORATOR)
我有一个 API 端点,允许用户(请求者)检索另一个用户(目标)的所有列表。我有以下两种情况:
案例 1:请求者 = 目标
我可以通过以下方式控制它:
`SELECT
"list".*,
"userList"."id" AS "userList.id",
"userList"."listId" AS "userList.listId"
FROM
"list" AS "list"
INNER JOIN
"userList" AS "userList"
ON "list"."id" = "userList"."listId" AND "userList"."userId" = '$targetUserId'`;
案例 2:请求者 =/= 目标
这是我卡住的地方,因为我有以下额外的限制:
一个用户只能看到其他用户的公开列表 或他们具有COLLABORATOR
或OWNER
角色的列表
所以我想做类似的事情:
获取与target
相关联的所有列表(无论角色如何),并且该列表是公开的,或者requester
也与该列表相关联。
样本数据
user table
id
----------
john
anna
list table
id | isPublic
------------------
1 false
2 true
3 false
userList table
id | userId | listId | role
- john 1 OWNER
- john 2 OWNER
- john 3 OWNER
- anna 1 COLLABORATOR
安娜请求查看约翰的所有列表
想要的结果:
[
id: 1,
isPublic: false
,
id: 2,
isPublic: true
]
任何帮助将不胜感激:)
非常感谢
【问题讨论】:
样本数据和期望的结果会有所帮助。 @GordonLinoff 编辑了请求的信息;让我知道它是否仍然不清楚 【参考方案1】:这是你想要的吗?
select l.*
from list
inner join userlist ul on ul.listid = l.id
group by l.id
having
bool_or(ul.role = 'OWNER' and ul.userid = 'john') -- owned by John
and (l.ispublic or bool_or(ul.userid = 'anna') -- public or allowed to Anna
【讨论】:
效果很好:) 我对结果中的 group by 有点困惑;我如何才能获得来自 userList 表的连接信息?以上是关于postgreSQL - 如何对加入模型结果有条件的主要内容,如果未能解决你的问题,请参考以下文章
将 PostgreSQL 函数包装在另一个中以有条件地组合结果