我试图使用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
更新:新版本
正如评论中所提到的,自我原帖以来,情况发生了变化.现在有单独distinct和col选项.国家文件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等等).
在上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)
| 归档时间: |
|
| 查看次数: |
42675 次 |
| 最近记录: |