首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >续写-在不同的条件下计算相同的关联两次

续写-在不同的条件下计算相同的关联两次
EN

Stack Overflow用户
提问于 2018-09-20 18:57:42
回答 1查看 1.6K关注 0票数 2

我试图根据不同的参数在关联表中获取两个记录计数:

代码语言:javascript
复制
// Models
var Customer = sequelize.define('Customer', {
    name: DataTypes.STRING,
});
var Invoice = sequelize.define('Invoice', {
    invoiceRef: DataTypes.STRING,
    status: {
        type: DataTypes.ENUM,
        values: ['UNPAID', 'PAID'],
        defaultValue: 'UNPAID'
    },
    isArchived: {
        type: DataTypes.BOOLEAN,
        defaultValue: false
    },
});
Invoice.associate = function(models) {
    Invoice.belongsTo(models.Customer);
}
Customer.associate = function (models) {
    Customer.hasMany(models.Invoice);
}


// Query
Customer.findAll({
    attributes: {
        include: [
            [models.Sequelize.fn("COUNT", models.Sequelize.fn("DISTINCT", models.Sequelize.col("Invoices.id"))), "totalInvoices"],
            [models.Sequelize.fn("COUNT", models.Sequelize.fn("DISTINCT", models.Sequelize.col("UnpaidInvoices.id"))), "unpaidInvoices"]
        ]
    },
    include: [
        {
            model: models.Invoice,
            where: { isArchived: false },
            attributes: [],
            required: false
        },
        {
            model: models.Invoice,
            where: { isArchived: false, status: 'UNPAID' },
            attributes: [],
            required: false
        },
    ],
    group: ['Customer.id']
})

问题是,当多次包含同一个关联表时,Sequelize为SQL查询中的两个表实例分配相同的名称:

左加入Invoices作为Invoices ON Customer.id = Invoices.CustomerIdInvoices.isArchived =0 左侧以Invoices形式加入Invoices ON Customer.id = Invoices.CustomerIdInvoices.isArchived =0和Invoices.status = 'UNPAID‘

是否有任何方式为查询中的联接表指定不同的名称?例如:

左加入Invoices作为Invoices ON Customer.id = Invoices.CustomerIdInvoices.isArchived =0 左外加入UnpaidInvoices ON Invoices AS Customer.id = Invoices.CustomerIdInvoices.isArchived =0和Invoices.status =‘un期’

EN

回答 1

Stack Overflow用户

发布于 2018-09-21 22:32:02

我通常只加入一次,然后在SUM中使用一个SUM语句,而不是使用COUNT --所有的行都是连接的,这就是为什么对两者都是相同的。

代码语言:javascript
复制
attributes: {
  include: [
    // count paid using case/sum via `status` != 'UNPAID'
    [ sequelize.fn('sum', sequelize.literal("CASE WHEN (`Invoices`.`status` != 'UNPAID' THEN 1 ELSE 0 END")), 'paid_count' ],
    // count unpaid using case/sum via `status` = 'UNPAID'
    [ sequelize.fn('sum', sequelize.literal("CASE WHEN (`Invoices`.`status` = 'UNPAID' THEN 1 ELSE 0 END")), 'unpaid_count' ],
  ],
  // ...
},
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52431579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档