【问题标题】:Using HAVING to filter based on the sum of a nested model in Sequelize Postgres使用 HAVING 根据 Sequelize Postgres 中嵌套模型的总和进行过滤
【发布时间】:2018-05-23 15:38:08
【问题描述】:

我在 Postgres 中有如下数据结构:

捐款

id  amount  status
1   5000    OK
2   7500    OK

捐赠物品

id  donationId  amount  includeInTotals
1   1           2500    false
2   1           2500    false
3   2           7500    false

在伪 SQL 中,我正在尝试执行以下操作:

SELECT * FROM donations WHERE SUM(SELECT donation.items WHERE "donationId" = "donations"."id" AND "includeInTotals" = false) >= "donations"."amount"

本质上是要删除“includeInTotals = false”捐赠项目的总数与捐赠价值相同的捐赠。

这是我目前为 Sequelize 获得的代码:

Models.donations.findAndCountAll({
   where: { status: 'OK' },
   include: {
        model: Models.donation_items,
        as: 'items',
        duplicating: false,
    },
   having: sequelize.literal('COALESCE(SUM(CASE WHEN "items"."includeInTotals" = false THEN items.amount ELSE 0 END), 0) < "donations"."amount"'),
   group: ['"donations.id"', '"items.id"']
});

这适用于 donation ID: 2 - 它不是由查询返回的,但 donation ID: 1 是,尽管两个金额等于 5000。

我对 SUM 有什么问题吗?

【问题讨论】:

    标签: node.js postgresql sequelize.js


    【解决方案1】:

    我可以提供一个应该有效的实际查询,这是答案的一半:

    SELECT d1.*
    FROM Donations d1
    LEFT JOIN
    (
        SELECT donationId, SUM(amount) AS amount
        FROM DonationItems di
        WHERE includeInTotals = false
        GROUP BY donationId
    ) d2
        ON d1.id = d2.donationId AND d1.amount = d2.amount
    WHERE
        d2.donationId IS NULL;
    

    虽然这不会触及您的 Sequelize 问题,但拥有正确的原始查询是在 PHP 中做任何事情的总先决条件,这将在以后取得成果。还有其他更有效的方法我们可以编写此查询,但上述版本可能最容易集成到您的 PHP 代码中。

    【讨论】:

      【解决方案2】:

      看起来这里的 GROUP 子句加入了捐赠项目并返回了错误的 SUM,所以我切换到 WHERE 子句中的子查询。我将此添加到我的 where 中,这对我有用!

      amount: {
              $gt: globals.sequelize.literal(`
                  (SELECT COALESCE(SUM(amount), 0) FROM donation_items
                  WHERE "donation_items"."includeInTotals" = false
                  AND "donation_items"."donationId" = "donations"."id")
              `),
      },
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多