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

时间:2014-03-25 18:27:18

标签: 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 );

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

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

生成以下查询:

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

5 个答案:

答案 0 :(得分:20)

更新:新版本

正如评论中所提到的,自我原帖以来,情况发生了变化。现在有单独的distinctcol选项。 The docs for distinct州:

  

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

看来,你现在想要的是:

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

原帖

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

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

该代码有效地生成此类查询:SELECT COUNT(args) FROM MyModel WHERE ...,其中args是选项对象中未保留的所有属性(例如DISTINCTLIMIT等等。)

答案 1 :(得分:4)

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

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

答案 2 :(得分:4)

指向Sequelize documentation on counta count method链接,不允许您指定哪个列来获取不同值的计数:

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

如果您已定义主键,则基本上为SELECT COUNT(DISTINCT(*))SELECT COUNT(DISTINCT(primaryKey))

为了做SELECT category, COUNT(DISTINCT(product)) as 'countOfProducts' GROUP BY category的Sequelize等效,您可以:

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

答案 3 :(得分:0)

关于您的问题,以便根据产品ID获得不同的产品计数

您只需要将值为'id'的键'distinct'传递给您的计数对象,这是示例

按照您的要求生成此sql查询

heroes_double_index.get_from_hero_name("Captain America")
>>> {"name": "Captain America", "alter_ego": "Steve Rogers"}


# Make the change
heroes_double_index.dict_heroes["Captain America"]["alter_ego"] = "Isaiah Bradley"

# The difference appears inside of the dictionary
heroes_double_index.get_from_hero_name("Captain America")
>>> {"name": "Captain America", "alter_ego": "Isaiah Bradley"}

# But I cannot use the new alterego for my search
heroes_double_index.get_from_alterego("Isaiah Bradley")
>>> None

在Sequelize查询中添加“ 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 );

这种使用'distinct'键过滤掉不同的计数或行的方法,我在Sequelize版本6中进行了测试。

希望这对您或其他人有帮助!

答案 4 :(得分:0)

我正在搜索 SELECT COUNT(0) 查询以获取 sequelize,下面是答案。

    let existingUsers = await Users.count({
        where: whereClouser,
        attributes: [[sequelize.fn('COUNT', 0), 'count']]
    });