sql - 在 sequelize 中使用 group by 和 joins

标签 sql node.js postgresql sequelize.js

我在 PostgreSQL 数据库上有两个表,即契约(Contract)和付款。一份契约(Contract)完成了多次付款。

我有以下两种型号:

 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;
};

我想汇总为每份契约(Contract)支付的所有款项,并使用此功能:

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";

我不要求选择 payment.id,因为我必须将它包含在我的聚合或分组函数中,正如我遇到的错误中所说:

Possibly unhandled SequelizeDatabaseError: error: column "payments.id" must appear in the GROUP BY clause or be used in an aggregate function

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

最佳答案

此问题已在 Sequelize 3.0.1 上修复,包含模型的主键必须用

排除
attributes: []

并且必须在主模型上进行聚合(this github issue 中的信息)。

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

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']
})

关于sql - 在 sequelize 中使用 group by 和 joins,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28206680/

相关文章:

postgresql - 为什么主键上的 "order by"会更改查询计划,从而忽略有用的索引?

mysql - 分组依据似乎不适用于联合 SQL 查询

mysql - 为 sql 中的列获取不正确的 AVG() 值

sql - Oracle SQL - 选择具有最高级别的行

node.js - 使用azure隐式流检索oauth访问 token

PostgreSQL错误代码,设置自定义错误代码

php - insert into 没有将数据插入到我的表中

javascript - 为什么我的表单多次 POSTING 并且 Socket 发出多个事件?

node.js - 从 LAN 内部和外部使用 socket.io

python - 在 SQLAlchemy 中,为什么我在关闭 session 后仍然可以提交到数据库?