【问题标题】:Sequelize - Counting the same association twice under different conditionsSequelize - 在不同条件下两次计算相同的关联
【发布时间】:2018-09-20 18:57:42
【问题描述】:

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

// 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 AS Invoices ON Customer.id = Invoices.CustomerId AND Invoices.isArchived = 0
左外连接 Invoices AS Invoices ON Customer.id = Invoices.CustomerId AND Invoices.isArchived = 0 AND Invoices.'@UNPAID'365 p>

有没有办法为查询中的连接表指定不同的名称?例如:

左外连接 Invoices AS Invoices ON Customer.id = Invoices.CustomerId AND Invoices.isArchived = 0
左外连接Invoices AS UnpaidInvoices ON Customer.id = Invoices.CustomerId AND Invoices.isArchived = 0 AND Invoices@. @ = '未付'

【问题讨论】:

    标签: sql count associations sequelize.js


    【解决方案1】:

    我通常只加入一次,然后将 CASE 语句与 SUM 一起使用,而不是使用 COUNT - 行都已加入,这就是为什么你会得到相同的结果。

    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' ],
      ],
      // ...
    },
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-15
      • 1970-01-01
      • 2018-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-14
      相关资源
      最近更新 更多