How can I do a group by across 3 tables with Sequelize?

匿名 (未验证) 提交于 2019-12-03 08:52:47

问题:

My models are:

module.exports = function(sequelize, DataTypes) {   var CommitFileStatistic;   return CommitFileStatistic = sequelize.define('CommitFileStatistic', {     additions: {       type: DataTypes.INTEGER,       allowNull: false     },     deletions: {       type: DataTypes.INTEGER,       allowNull: false     },     status: {       type: DataTypes.STRING,       allowNull: false     },     fileSize: {       type: DataTypes.INTEGER,       allowNull: true     },     levenshteinDelta: {       type: DataTypes.INTEGER,       allowNull: true     },     fileHash: {       type: DataTypes.STRING,       allowNull: true     }   }, {     classMethods: {       associate: function(models) {         CommitFileStatistic.belongsTo(models.Commit);         return CommitFileStatistic.belongsTo(models.SourceFile);       }     }   }); };  module.exports = function(sequelize, DataTypes) {   var SourceFile;   return SourceFile = sequelize.define('SourceFile', {     filename: {       type: DataTypes.STRING,       allowNull: false     }   }, {     classMethods: {       associate: function(models) {         return SourceFile.belongsTo(models.Repository);       }     }   }); };  module.exports = function(sequelize, DataTypes) {   var Commit;   return Commit = sequelize.define('Commit', {     sha: {       type: DataTypes.STRING,       allowNull: false     },     commitTime: {       type: DataTypes.INTEGER,       allowNull: false     },     message: {       type: DataTypes.TEXT,       allowNull: false     },     isParsed: {       type: DataTypes.BOOLEAN,       allowNull: false,       defaultValue: false     }   }, {     classMethods: {       associate: function(models) {         Commit.hasMany(models.Branch);         return Commit.hasMany(models.Commit, {           as: 'Parent',           through: 'ParentCommit'         });       }     }   }); };

I want to do a query that would basically do: SELECT COUNT(*) AS fileCount, sf.* FROM CommitFileStatistics cfs, Commits c, SourceFiles sf WHERE cfs.CommitId = c.id AND cfs.SourceFileId = sf.id AND c.RepositoryId = 2 GROUP BY cfs.SourceFileId ORDER BY fileCount DESC however I want to use the ORM instead of a raw query. Is this possible?

回答1:

Something like this should be what you are looking for:

return CommitFileStatistic.findAll({   attributes: [[Sequelize.fn('COUNT', '*'), 'fileCount']],   include: [     { model: Commit, attributes: [] },     { model: SourceFile, attributes: [] }   ],   group: ['SourceFileId'],   order: [['fileCount', 'DESC']] });

Which will result in the following query:

SELECT      `CommitFileStatistic`.`id`,      COUNT('*') AS `fileCount`,      `Commit`.`id` AS `Commit.id`,      `SourceFile`.`id` AS `SourceFile.id`  FROM      `commit_file_statistics` AS `CommitFileStatistic`  LEFT OUTER JOIN `commits` AS `Commit`      ON `Commit`.`id` = `CommitFileStatistic`.`CommitId`  LEFT OUTER JOIN `source_files` AS `SourceFile`      ON `SourceFile`.`id` = `CommitFileStatistic`.`SourceFileId`  GROUP BY `SourceFileId`  ORDER BY `fileCount` DESC;

This will probably only work on sequelize version 2.0 :)



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!