mysql - 如何在与sequ​​elize Node 的关系上使用having子句

标签 mysql sql node.js orm sequelize.js

我有 2 个型号,businessdocuments1:n关系,我想过滤 business有两种方式,

  1. businessdocuments每一个document.due_balance大于0
  2. businessdocuments每一个document.due_balance等于0

我想做这样的东西

select
    A.name, B.due_balance, sum(B.due_balance) as total_due_balance
from
    business A
inner join documents B ON A.id = B.business_id
group by A.id
having total_due_balance > 0;

select
    A.name, B.due_balance, sum(B.due_balance) as total_due_balance
from
    business A
inner join documents B ON A.id = B.business_id
group by A.id
having total_due_balance = 0;

这些将得到我想要的东西,问题是以前的代码是用sequelize ORM制作的,我无法更改它,像这样

const 企业 = 等待 db.business.paginate({ 属性: [ ... ], 在哪里: { ...//一堆地方 }, 页面:parseInt(params.page, 10) || 1、 分页:parseInt(params.limit, 10) || 10、 });

这里是问题开始的地方,我不知道如何连接表并使用必须过滤它,我尝试添加这个

let toInclude;
if (params.contactability === 'with_balance') {
    toInclude = {
        include : [
            {
                attributes: [
                    [db.Sequelize.fn('sum', db.Sequelize.col('due_balance')), 'total_due_balance'],
                ],
                model: db.document,
                as: 'documents',
                having: db.Sequelize.where(db.Sequelize.fn('sum', db.Sequelize.col('due_balance')), {
                    $gt: 0,
                }),
            },
        ],
    };
} else if(params.contactability === 'without_balance') {
    toInclude = {
        include : [
            {
                attributes: [
                    [db.Sequelize.fn('sum', db.Sequelize.col('due_balance')), 'total_due_balance'],
                ],
                model: db.document,
                as: 'documents',
                having: db.Sequelize.where(db.Sequelize.fn('sum', db.Sequelize.col('due_balance')), {
                    $eq: 0,
                }),
            },
        ],
    };
} else {
    toInclude = {};
}
const businesses = await db.business.paginate({
    attributes: [
    ...
    ],
    where: {
    ...
    },
    ...toInclude,
    page: parseInt(params.page, 10) || 1,
    paginate: parseInt(params.limit, 10) || 10,
});

但这根本不起作用,我该如何解决这个问题?

最佳答案

  1. 我认为如果没有 GROUP,HAVING 就无法发挥作用。

  2. 我会将having 子句移到include 部分之外并使用AS 别名。

所以,粗略地说:

group: ['id'],//以及您需要的其他内容 有:{'documents.total_balance_due':{$eq:0}}

(对别名进行一些猜测)

关于mysql - 如何在与sequ​​elize Node 的关系上使用having子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57809779/

相关文章:

javascript - 什么是 process.env.NODE_ENV

node.js - 无法使用@babel/preset-env运行node.js文件

mysql - 请求已超过 CFQUERY 标记允许的时间限制错误

mysql - 数据透视表 : getting data from one column

SQL NOT IN 不工作

php - 如何通过结束 session 从站点注销

javascript - 从某些人身上获取值(value)?

mysql - 如何从具有多个值的 EAV 结构中选择数据

php - 数据库 |来自两个表的条​​件查询

具有多个嵌套 JOIN 的 MySQL 查询