【问题标题】:Postgres / SQL count across multiple tables based on multiple tablesPostgresql 基于多表跨多表计数
【发布时间】:2019-05-28 16:42:07
【问题描述】:

我有 4 个表,目标是一个简单的真/假(或者如果更容易计数)是否存在基于给定的 User.uuidResource.uuidAccountLinkResourceLink

最小的工作示例

http://sqlfiddle.com/#!17/09144/1

目标

基于User.uuidResource.uuid 的正确/错误响应,它们不相关。

架构

User
- id
- uuid

Resource
- id
- account_id
- uuid

AccountLink
- id
- account_id
- user_id

ResourceLink
- id
- resource_id
- user_id

目前工作中

给出id列表而不是true/false,可以在应用程序代码中处理,但是查询本身也是低效的:

SELECT id
FROM "AccountLinks"
WHERE user_id = (SELECT id FROM "Users" WHERE uuid = ?) 
  AND account_id = (SELECT account_id FROM "Resources" WHERE uuid = ?)
UNION
SELECT id
FROM "ResourceLinks"
WHERE user_id = (SELECT id FROM "Users" WHERE uuid = ?)
  AND resource_id = (SELECT id FROM "Resources" WHERE uuid = ?)

有没有办法根据uuid 找到正确的userresource 一次,然后使用这些id 属性对多个表进行计数?

【问题讨论】:

  • 您提到了计数和真/假,但您的查询返回了一个 id 列表。所以不确定你想要什么结果
  • user.uuid 是否与 resource.uuid 相关?还是两个分开的输入?
  • @JuanCarlosOropeza 更新了我的问题以澄清

标签: sql postgresql


【解决方案1】:

嗯。 . .我想你想要一个 cross join 并提供额外的信息:

select 
  (exists (select 1
     from "AccountLinks" al
     where al.user_id = u.id and al.account_id = r.account_id
  )) as has_accountlink,
  (exists (select 1
     from "ResourceLinks" rl
     where rl.user_id = u.id and rl.resource_id = r.id
  )) as has_resourcelink
from "Users" u cross join
     "Resources" r 
where u.uuid = ? and r.uuid = ?

【讨论】:

  • 您错过了LEFT JOIN ON 条件。 resource.uuid 似乎也有一个输入变量。
  • 我会调查cross join。同时uuidUserResource 不同。我已经更新了我的问题以更清楚地反映这一点。
猜你喜欢
  • 2014-12-23
  • 2017-08-06
  • 1970-01-01
  • 1970-01-01
  • 2011-10-14
  • 1970-01-01
  • 2013-09-11
  • 1970-01-01
  • 2013-05-29
相关资源
最近更新 更多