Solución:
ACTUALIZAR: Nueva versión
Como se mencionó en los comentarios, las cosas han cambiado desde mi publicación original. Ahora hay separado distinct
y col
opciones. Los documentos para distinct
estado:
Aplicar COUNT (DISTINCT (col)) en la clave principal o en options.col.
Parece que ahora quieres algo como:
MyModel.count({
include: ...,
where: ...,
distinct: true,
col: 'Product.id'
})
.then(function(count) {
// count is an integer
});
Publicación original
Después de mirar el método Model.count en lib / model.js, y rastrear algo de código, encontré que al usar Model.count
, puede agregar cualquier tipo de argumento de función agregada compatible con MYSQL a su objeto de opciones. El siguiente código le dará la cantidad de diferentes valores en MyModel
‘s someColumn
:
MyModel.count({distinct: 'someColumn', where: {...}})
.then(function(count) {
// count is an integer
});
Ese código genera efectivamente una consulta de este tipo: SELECT COUNT(args) FROM MyModel WHERE ...
, dónde args
son todas las propiedades en el objeto de opciones que no están reservadas (como DISTINCT
, LIMIT
etcétera).
Parece que esto ahora es compatible con las versiones 1.7.0+ de Sequelize.
los count
y findAndCountAll
Los métodos de un modelo le darán un recuento ‘real’ o ‘distinto’ de su modelo principal.
La documentación de Sequelize sobre count
enlaces a un método de recuento que no le permite especificar qué columna obtener el recuento de valores distintos:
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);
};
Básicamente SELECT COUNT(DISTINCT(*))
o SELECT COUNT(DISTINCT(primaryKey))
si tiene una clave primaria definida.
Para hacer el equivalente de Sequelize de SELECT category, COUNT(DISTINCT(product)) as 'countOfProducts' GROUP BY category
, harías:
model.findAll({
attributes: [
'category',
[Sequelize.literal('COUNT(DISTINCT(product))'), 'countOfProducts']
],
group: 'category'
})