【发布时间】:2020-09-12 05:25:53
【问题描述】:
我正在尝试使用多个左连接进行此查询,但为与项目 ID 关联的每个费用返回重复的更新和科学家(例如,如果有 5 次费用,则每次更新和科学家返回 5 次)。我试图避免使用多个 select 语句,但遇到了问题。
SELECT
projects.*,
coalesce(json_agg(updates ORDER BY update_date DESC) FILTER (WHERE updates.id IS NOT NULL), '[]') AS updates,
coalesce(json_agg(scientists) FILTER (WHERE scientists.user_id IS NOT NULL), '[]') AS scientists,
coalesce(SUM(charges.amount), 0) AS donated,
coalesce(COUNT(charges), 0) AS num_donations
FROM projects
LEFT JOIN updates
ON updates.project_id = projects.id
LEFT JOIN scientists
ON scientists.project_id = projects.id
LEFT JOIN charges
ON charges.project_id = projects.id
WHERE projects.id = '${id}'
GROUP BY projects.id;
预期结果(改为仅返回 id):
id | updates | scientists | donated | num_donations
--------------------------------------+------------------------------------------+------------------------------------+---------+---------------
17191850-9a03-482f-9afe-7dc6b69974ea | ["0c29417f-0afb-44df-a8cf-24dc5cc7962c"] | ["auth0|5efcfb5f652e5a0019ce2193"] | 155 | 5
实际结果:
id | updates | scientists | donated | num_donations
--------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------+---------------
17191850-9a03-482f-9afe-7dc6b69974ea | ["0c29417f-0afb-44df-a8cf-24dc5cc7962c", "0c29417f-0afb-44df-a8cf-24dc5cc7962c", "0c29417f-0afb-44df-a8cf-24dc5cc7962c", "0c29417f-0afb-44df-a8cf-24dc5cc7962c", "0c29417f-0afb-44df-a8cf-24dc5cc7962c"] | ["auth0|5efcfb5f652e5a0019ce2193", "auth0|5efcfb5f652e5a0019ce2193", "auth0|5efcfb5f652e5a0019ce2193", "auth0|5efcfb5f652e5a0019ce2193", "auth0|5efcfb5f652e5a0019ce2193"] | 155 | 5
【问题讨论】:
-
以表格格式提供样本数据和您的预期输出
-
更新了!感谢@Fahmi 的建议
-
“如果有 5 次收费,则每位科学家返回 5 次” - 因此仅限于您想要的 1 次收费。这称为笛卡尔积。数据库正在给你你所要求的;您必须更准确地要求您要求的内容。您没有告诉我们您想要哪一项费用(最新的、最高的,将所有费用分组到一个 csv 中),所以我们不知道该做什么,就像数据库知道该做什么一样
-
@CaiusJard 我不认为我理解正确。我希望为指定的项目 ID 返回所有科学家和更新,但在与该项目 ID 关联的数据库中只有一个不同的更新和科学家。当我添加带有费用的连接(与项目 ID 相关联的 X 项不同费用)时,科学家和更新会重复 X 次。
-
当然是。您希望矩形结果网格看起来如何?您有 1 个项目、1 个项目科学家、1 个项目更新和 5 个项目费用。如果您加入项目、科学家和更新,您将获得 1 行。当您在数据库中添加费用时,必须重复项目/科学家/更新数据 5 次,每 5 次费用重复一次。如果只有最新的费用是相关的,那么您就进行查询的那一部分,因为只有五个费用行中的一个适用,您将再次获得一行
标签: sql json postgresql count left-join