node.js - 使用 HAVING 根据 Sequelize Postgres 中嵌套模型的总和进行过滤

标签 node.js postgresql sequelize.js

我在 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”捐赠项目的总数与捐赠值(value)相同的捐赠。

这是我迄今为止为 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"']
});

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

我用 SUM 做的有什么问题吗?

最佳答案

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

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 代码中。

关于node.js - 使用 HAVING 根据 Sequelize Postgres 中嵌套模型的总和进行过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50481035/

相关文章:

node.js - React 不会切换到生产模式

sql - 如何在 PostgreSQL/SQL 中使用结果的子串

ruby-on-rails - 我如何获得在 rake 任务中工作的 Rails 控制台中工作的 Active Record 查询?

mysql - Node Js Sequelize 原始查询以 Sequelize ORM

sequelize.js - 在 Sequelize 中使用 findByPk 和 WHERE 条件

node.js - 如何使用node js在ffmpeg中将mp4视频转换为m3u8

node.js - sailsjs 水线搜索到两个表

postgresql - Sequelize Postgres - 处理并发请求

mysql - SQL 中的分组或 Sequelize 中的 where check 和 where in count 以及

javascript - mongodb .toArray 与 .each (阻塞与异步?)