首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在sequelize中使用group by和joins

在sequelize中使用group by和joins
EN

Stack Overflow用户
提问于 2015-01-29 11:45:09
回答 4查看 43.5K关注 0票数 33

我在PostgreSQL数据库上有两个表,合同和付款。一份合同完成了多次付款。

我有以下两个模型:

代码语言:javascript
复制
 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;
};

我想汇总每个合同的所有付款,并使用此函数:

代码语言:javascript
复制
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']
})

但它会生成以下查询:

代码语言:javascript
复制
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,因为我必须将它包含在聚合或group by函数中,就像我遇到的错误中所说的那样:

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

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-06-04 16:16:58

此问题已在Sequelize 3.0.1中修复,包含的型号的主键必须使用

代码语言:javascript
复制
attributes: []

并且聚合必须在主模型上完成(this github issue中的infos)。

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

代码语言:javascript
复制
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']
})
票数 39
EN

Stack Overflow用户

发布于 2015-03-03 18:51:45

你能把你的函数写成

代码语言:javascript
复制
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']
})
票数 2
EN

Stack Overflow用户

发布于 2015-03-04 01:15:16

试一试

代码语言:javascript
复制
group: ['contracts.id', 'payments.id']
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28206680

复制
相关文章

相似问题

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