如何通过NodeJS Sequelize中的查询来统计组

在Rails中,我可以执行一个简单的ORM查询模型的喜欢数量:

@records = Model .select( 'model.*' ) .select( 'count(likes.*) as likes_count' ) .joins( 'LEFT JOIN likes ON model.id = likes.model_id' ) .group( 'model.id' ) 

这会生成查询:

 SELECT models.*, count(likes.*) as likes_count FROM "models" JOIN likes ON models.id = likes.model_id GROUP BY models.id 

在Node Sequelize中,任何类似的尝试都会失败:

 return Model.findAll({ group: [ '"Model".id' ], attributes: ['id', [Sequelize.fn('count', Sequelize.col('"Likes".id')), 'likes_count']], include: [{ attributes: [], model: Like }], }); 

这会生成查询:

 SELECT Model.id, count(Likes.id) AS likes_count, Likes.id AS Likes.id # Bad! FROM Models AS Model LEFT OUTER JOIN Likes AS Likes ON Model.id = Likes.model_id GROUP BY Model.id; 

这会产生错误:

 column "Likes.id" must appear in the GROUP BY clause or be used in an aggregate function 

这是错误地select了like.id,我不知道为什么,也不知道如何摆脱它。

这个续集github问题看起来完全像你的情况:

 User.findAll({ attributes: ['User.*', 'Post.*', [sequelize.fn('COUNT', 'Post.id'), 'PostCount']], include: [Post] } 

为了解决这个问题,我们需要升级到sequelize的最新版本,并包括raw = true,这是我做了很多迭代和偏离谷歌search之后做了什么。

  getUserProjectCount: function (req, res) { Project.findAll( { attributes: ['User.username', [sequelize.fn('COUNT', sequelize.col('Project.id')), 'ProjectCount']], include: [ { model: User, attributes: [], include: [] } ], group: ['User.username'], raw:true } ).then(function (projects) { res.send(projects); }); } 

我的参考模型在哪里

 //user var User = sequelize.define("User", { username: Sequelize.STRING, password: Sequelize.STRING }); //project var Project = sequelize.define("Project", { name: Sequelize.STRING, UserId:{ type:Sequelize.INTEGER, references: { model: User, key: "id" } } }); Project.belongsTo(User); User.hasMany(Project); 

迁移ORM之后,创build“用户”和“项目”表到我的postgres服务器。 这是ORM的SQL查询

 SELECT "User"."username", COUNT("Project"."id") AS "ProjectCount" FROM "Projects" AS "Project" LEFT OUTER JOIN "Users" AS "User" ON "Project"."UserId" = "User"."id" GROUP BY "User"."username";