Sql 在sequelize中使用GROUPBY和JOIN

Sql 在sequelize中使用GROUPBY和JOIN,sql,node.js,postgresql,sequelize.js,Sql,Node.js,Postgresql,Sequelize.js,我在PostgreSQL数据库中有两个表,合同和付款。一份合同有多笔付款 我有以下两种型号: module.exports = function(sequelize, DataTypes) { var contracts = sequelize.define('contracts', { id: { type: DataTypes.INTEGER, autoIncrement: true } }, { createdAt: false,

我在PostgreSQL数据库中有两个表,合同和付款。一份合同有多笔付款

我有以下两种型号:

 module.exports = function(sequelize, DataTypes) {
  var contracts = sequelize.define('contracts', {
    id: {
      type: DataTypes.INTEGER,
      autoIncrement: true
    }
  }, {
    createdAt: false,
    updatedAt: false,
    classMethods: {
      associate: function(models) {
        contracts.hasMany(models.payments, {
          foreignKey: 'contract_id'
        });
      }
    }
  });


  return contracts;
};

module.exports = function(sequelize, DataTypes) {
  var payments = sequelize.define('payments', {
    id: {
      type: DataTypes.INTEGER,
      autoIncrement: true
    },
    contract_id: {
      type: DataTypes.INTEGER,
    },
    payment_amount: DataTypes.INTEGER,
  }, {
    classMethods: {
      associate: function(models) {
        payments.belongsTo(models.contracts, {
          foreignKey: 'contract_id'
        });
      }
    }
  });


  return payments;
};
我想对每份合同的所有付款进行汇总,并使用此功能:

models.contracts.findAll({
    attributes: [
        'id'
    ],
    include: [
    {
        model: models.payments,
        attributes: [[models.sequelize.fn('sum', models.sequelize.col('payments.payment_amount')), 'total_cost']]
    }
    ],
    group: ['contracts.id']
})
但它会生成以下查询:

SELECT "contracts"."id", "payments"."id" AS "payments.id", sum("payments"."payment_amount") AS "payments.total_cost" 
FROM "contracts" AS "contracts" 
LEFT OUTER JOIN "payments" AS "payments" ON "contracts"."id" = "payments"."contract_id" GROUP BY "contracts"."id";
我不要求选择payments.id,因为我必须将其包括在我的聚合或分组功能中,如错误中所述:

可能未处理的SequelizeDatabaseError:错误:列“payments.id” 必须出现在GROUP BY子句中或在聚合函数中使用


我是不是遗漏了什么?我正在关注,但即使在那里,我也不明白SQL请求如何有效。

这是您可能希望从
付款
和加入
合同中选择的问题,而不是相反的方式?

您可以将函数编写为

models.contracts.findAll({
    attributes: [
        'models.contracts.id'
    ],
    include: [
    {
        model: models.payments,
        attributes: [[models.sequelize.fn('sum', models.sequelize.col('payments.payment_amount')), 'total_cost']]
    }
    ],
    group: ['contracts.id']
})
试一试


此问题已在Sequelize 3.0.1上修复,随附模型的主键必须排除在外

attributes: []
并且必须在主模型(中的infos)上进行聚合

因此,对于我的用例,代码如下

models.contracts.findAll({
    attributes: ['id', [models.sequelize.fn('sum', models.sequelize.col('payments.payment_amount')), 'total_cost']],
    include: [
    {
        model: models.payments,
        attributes: []
    }
    ],
    group: ['contracts.id']
})

谢谢,但是如果我按“payments.id”分组,我将无法对payments.payments\u amount进行求和。
属性:[“payments\u amount”,“models.sequelize.fn('sum',models.sequelize.col('payments.payments\u amount'),“total\u cost']”如何?
。基本上,如果选择“nothing”,sequelize将选择id。如果成功,我会更新我的答案。希望如此。不幸的是,始终存在相同的错误:
可能未处理的SequelizeDatabaseError:列“payments.id”必须出现在GROUP BY子句中,或用于聚合函数中
您的意思是“contracts.id”而不是“models.contracts.id”?无论如何,第一个给了我相同的错误,第二个抛出另一个SQL错误(缺少FROM子句)。
models.contracts.findAll({
    attributes: ['id', [models.sequelize.fn('sum', models.sequelize.col('payments.payment_amount')), 'total_cost']],
    include: [
    {
        model: models.payments,
        attributes: []
    }
    ],
    group: ['contracts.id']
})