2016-02-26 4 views
1

Мой SQL запросКак преобразовать комплекс GROUP BY в Sequelize?

SELECT t."id", t."topicText", COUNT(t."id") AS topicCount 
FROM "WorkbookQuestions" wq, "Workbooks" w, "Questions" q, "Topics" t 
WHERE w."StudentId" = 3 
    AND wq."QuestionId" = q."id" 
    AND wq."WorkbookId" = w."id" 
    AND q."TopicId" = t."id" 
GROUP BY "t"."id" 
ORDER BY "topiccount" DESC 

Как я могу написать это в Sequelize коде, так что я могу не писать SQL непосредственно? Или это невозможно?

Это то, что я пытался (безуспешно) до сих пор:

db.WorkbookQuestion.findAll({ 
    attributes: ['Topics.id', [db.sequelize.fn('COUNT', db.sequelize.col('Topics.id'))], 'TopicCount'], 
    include: [ 
    { 
     model: db.Workbook, 
     where: { 
     StudentId: newWorkbook.StudentId, 
     SubjectId: newWorkbook.SubjectId 
     } 
    }, { 
     model: db.Question, 
     include: [ 
     { 
      model: db.Topic 
     } 
     ] 
    } 
    ], 
    group: ['Topics.id'] 
}); 
+1

Любые ошибки? Как выглядит запрос, который Sequelize производит для вашего примера? – tiblu

ответ

1

Просто глядя на него, я хотел бы написать код, как этот

db.Workbook.findAll({ 
    attributes: ['wbquestion.question.topic.id', [db.sequelize.fn('COUNT', db.sequelize.col('wbquestion.question.topic.id'))], 'topiccount'], 
    include: [ 
    { 
     model: db.WorkbookQuestion, 
      as: wbquestion, 
     where: { 
       id: wbquestion.workbookId  
      }, 
      include: [ 
       model: db.Question, 
       as: question, 
       where: { 
        id: wbquestion.questionId 
       }, 
       include: [ 
        model: db.Topic, 
        as: topic, 
        where: { 
         id: question.topicId 
        } 
       ] 
      ] 
    } 
    ], 
    where: { 
     studentId : 3 
    } 
    group: ['topic.id'] 
}); 

Может быть, вы можете получить более читаемым кода, определяя модели и отношения отдельно и с помощью нетерпеливой загрузки.

Edit: Сформированные миграциях и модели

node_modules/.bin/sequelize model:create --name Student --attributes firstName:string,lastName:string 
node_modules/.bin/sequelize model:create --name Topic --attributes topicText:string 
node_modules/.bin/sequelize model:create --name Question --attributes TopicId:integer 
node_modules/.bin/sequelize model:create --name Workbook --attributes studentId:integer 
node_modules/.bin/sequelize model:create --name WorkbookQuestion --attributes QuestionId:integer,WorkbookId:integer 

Простая программа для тестирования запроса в лог консоли.

var Sequelize = require("sequelize"); 

var models = require('./models/index'); 

models.WorkbookQuestion.belongsTo(models.Question, {foreignKey: 'QuestionId'}); 
models.WorkbookQuestion.belongsTo(models.Workbook, {foreignKey: 'WorkbookId'}); 

models.Question.hasOne(models.WorkbookQuestion); 

models.Workbook.hasOne(models.WorkbookQuestion); 
models.Workbook.belongsToMany(models.Question, {through: models.WorkbookQuestion}); 
models.Workbook.belongsToMany(models.Topic, {through: models.Question}); 


var res = models.Workbook.findAll({ 
    attributes: ['topicId', Sequelize.fn('count', Sequelize.col('topiccount'))], 
    include: [models.WorkbookQuestion, models.Question, models.Topic], 
    where: { 
     studentId: 3 
    }, 
    group: ['topic.id'] 
}).then(function(data) { 
    console.log(data); 
}).catch(function(err) { 
    console.trace(err); 
}); 

Результат:

SequelizeDatabaseError: колонка Topics.Question.WorkbookId не существует

Может быть, вы можете исправить отношения между моделями или вы должны создать запрос, не используя функциональность FindAll.