我试图使用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 );
答案 0 :(得分:20)
更新:新版本
正如评论中所提到的,自我原帖以来,情况发生了变化。现在有单独的distinct
和col
选项。 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
是选项对象中未保留的所有属性(例如DISTINCT
,LIMIT
等等。)
答案 1 :(得分:4)
Sequelize 1.7.0 +版本现在支持此功能。
模型的count
和findAndCountAll
方法会为您提供父模型的“真实”或“不同”计数。
答案 2 :(得分:4)
指向Sequelize documentation on count
的a 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']]
});