postgreSQL - 如何对加入模型结果有条件

Posted

技术标签:

【中文标题】postgreSQL - 如何对加入模型结果有条件【英文标题】:postgreSQL - How to have condition on Join model result 【发布时间】:2021-03-27 08:37:15 【问题描述】:

我一直在努力研究如何将我的业务需求转换为 SQL 查询。

案件本身并不复杂。我有两个主表 userlist 以及它们之间的多对多关系通过 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:请求者 =/= 目标

这是我卡住的地方,因为我有以下额外的限制:

一个用户只能看到其他用户的公开列表 或他们具有COLLABORATOROWNER 角色的列表

所以我想做类似的事情: 获取与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 函数包装在另一个中以有条件地组合结果

PostgreSQL如何对结果进行分组以使所有行都必须为真?

使用时间戳列在 postgresql 上联合加入

PostgreSQL array_agg 但有停止条件

PostgreSQL递归查询

Drupal 8 和 PostgreSQL:如何在 WHERE 子句中使用表达式的结果?