如何用sequelize获得一个独特的计数?

Ada*_*dam 22 sequelize.js

我试图使用sequelize获得特定列的明确计数.我最初的尝试是使用我的模型的'count'方法,但它看起来不可能.

需要DISTINCT功能,因为我正在连接其他表并根据相关表过滤父级的行.

这是我想要的查询:

SELECT COUNT(DISTINCT Product.id) as `count` 
FROM `Product` 
LEFT OUTER JOIN `Vendor` AS `vendor` ON `vendor`.`id` = `Product`.`vendorId` 
WHERE (`vendor`.`isEnabled`=true );
Run Code Online (Sandbox Code Playgroud)

对我的产品型号使用以下查询:

Product.count({
        include: [{model: models.Vendor, as: 'vendor'}],
        where: [{ 'vendor.isEnabled' : true }]
    })
Run Code Online (Sandbox Code Playgroud)

生成以下查询:

SELECT COUNT(*) as `count` 
FROM `Product` 
LEFT OUTER JOIN `Vendor` AS `vendor` ON `vendor`.`id` = `Product`.`vendorId` 
WHERE (`vendor`.`isEnabled`=true );
Run Code Online (Sandbox Code Playgroud)

Dom*_*omi 22

更新:新版本

正如评论中所提到的,自我原帖以来,情况发生了变化.现在有单独distinctcol选项.国家文件distinct:

在主键或options.col上应用COUNT(DISTINCT(col)).

看来,你现在想要的是:

MyModel.count({
  include: ...,
  where: ...,
  distinct: true,
  col: 'Product.id'
})
.then(function(count) {
    // count is an integer
});
Run Code Online (Sandbox Code Playgroud)

原帖

在查看lib/model.js中的Model.count方法并跟踪一些代码之后,我发现在使用时Model.count,您可以将MYSQL支持的任何类型的聚合函数参数添加到您的选项对象中.以下代码将为您提供MyModels 中不同值的数量someColumn:

MyModel.count({distinct: 'someColumn', where: {...}})
.then(function(count) {
    // count is an integer
});
Run Code Online (Sandbox Code Playgroud)

该代码有效地生成了这种类型的查询:SELECT COUNT(args) FROM MyModel WHERE ...,argsoptions对象中所有未保留的属性(例如DISTINCT,LIMIT等等).

  • 实际上,distinct参数是一个布尔参数,它只表示是否应该使用distinct.不同的计数总是应用在模型的主键上,因此该解决方案将无法相应地工作,至少不适用于当前的续集版本. (3认同)

use*_*238 7

上Sequelize文档count链接上的计数方法,它不会让你指定要获得不同值的计数的列:

Model.prototype.count = function(options) {
  options = Utils._.clone(options || {});
  conformOptions(options, this);
  Model.$injectScope(this.$scope, options);
  var col = '*';
  if (options.include) {
    col = this.name + '.' + this.primaryKeyField;
    expandIncludeAll.call(this, options);
    validateIncludedElements.call(this, options);
  }
  Utils.mapOptionFieldNames(options, this);
  options.plain = options.group ? false : true;
  options.dataType = new DataTypes.INTEGER();
  options.includeIgnoreAttributes = false;
  options.limit = null;
  options.offset = null;
  options.order = null;
  return this.aggregate(col, 'count', options);
};
Run Code Online (Sandbox Code Playgroud)

基本上SELECT COUNT(DISTINCT(*))SELECT COUNT(DISTINCT(primaryKey))是否已定义主键。

要执行的等效序列SELECT category, COUNT(DISTINCT(product)) as 'countOfProducts' GROUP BY category,您需要执行以下操作:

model.findAll({
  attributes: [
    'category',
    [Sequelize.literal('COUNT(DISTINCT(product))'), 'countOfProducts']
  ],
  group: 'category'
})
Run Code Online (Sandbox Code Playgroud)


Ada*_*dam 6

看起来Sequelize 1.7.0+版本现在支持此功能。

模型的countfindAndCountAll方法将为您提供父模型的“真实”或“不同”计数。