当前位置: 首页 > 面试题库 >

使用分组依据并加入续集

裴和怡
2023-03-14
问题内容

我在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请求如何有效。


问题答案:

此问题已在Sequelize 3.0.1中修复,必须使用以下命令排除包含模型的主键:

attributes: []

并且必须在主模型上完成聚合(此github问题中的信息)。

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

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


 类似资料:
  • 问题内容: 我明白这一点。 但是,它是如何工作的,又意味着什么呢? 问题答案: 意味着 将所有具有相同X值的那些放在一组 。 意味着 将所有具有相同X和Y值的那些放在一组中 。 为了举例说明,假设我们有一个下表,该表与谁在大学里修读什么科目有关: 仅在主题列上使用a时;说: 您将获得类似以下内容的信息: …因为ITB001有5个条目,MKB114有2个条目 如果我们要到两列: 我们会得到这个: 这

  • 问题内容: 如何返回在MySQL中实际上是“连续的” GROUP BY的内容。换句话说,GROUP BY是否尊重记录集的顺序? 例如,从下表中,col1是唯一的有序索引: 返回: 但我需要返回以下内容: 问题答案: 使用: 这里的关键是创建一个允许分组的人为值。 以前,更正了Guffa的答案:

  • 问题内容: 只是对SQL语法感到好奇。所以如果我有 这将是不正确的,因为 真的应该是 但是为什么我们不能仅仅为了方便而使用前者呢? 问题答案: 就像按以下顺序执行查询一样实现SQL: FROM子句 WHERE子句 GROUP BY子句 HAVING子句 SELECT子句 ORDER BY子句 对于大多数关系数据库系统,此顺序说明了哪些名称(列或别名)有效,因为它们必须在上一步中引入。 因此,在Or

  • 问题内容: 我有一张标签表,想从列表中获得计数最高的标签。 样本数据如下所示 使用 让我得到正在寻找的完美数据。但是,我想对它进行组织,以使最高的标签数排在首位,并限制它仅向我发送前20个左右。 我试过了 而且我不断收到“组功能的无效使用-ErrNr 1111” 我究竟做错了什么? 我正在使用MySQL 4.1.25-Debian 问题答案: 在所有版本的MySQL中,只需在SELECT列表中为聚

  • 此实例中的任务是获取数据库中每个作者的最新文章。 示例查询产生不可用的结果,因为它并不总是返回的最新消息。 目前公认的答案是 编辑:这个问题是另一个问题的延续,我的具体情况略有不同。您可以(也应该)假设还有一个wp_posts.id是该特定帖子的唯一标识符。

  • 问题内容: 我有这种一级树情况: json在哪里: 问题在于,这会与孩子一起创建optgroup,但也会重复其根: 我想生产: 问题答案: 如果您将json更改为以下内容,则分组将无法完全实现: 然后,您将按照想要的方式进行分组 jsFiddle:http : //jsfiddle.net/rtCP3/182/