javascript - Sequelize 查询 SELECT * FROM Table 只返回一行

标签 javascript sql node.js postgresql sequelize.js

我目前正在使用 PostgreSQL 和 Sequelize.js 来查询一些数据。当我使用 sequelize.query() 时,它只返回一行数据,但是当我通过 pgAdmin 输入它时,它按预期工作。
这是我在 sequelize.query() 中使用的代码。

   SELECT table2.student_id,
          s.canvasser_name,
          l.level_name,
          table2.total_score
   FROM (SELECT table1.student_id,
                sum(table1.max_score) total_score
         FROM (SELECT sq.student_id,
               max(sq.score) max_score
               FROM public.student_quiz sq
               GROUP BY sq.quiz_id, sq.student_id) table1
         GROUP BY table1.student_id) table2
   INNER JOIN public.student s
           ON s.id = table2.student_id
   INNER JOIN public.level l
           ON l.id = s.level_id
   ORDER BY table2.total_score DESC
   LIMIT 10;
这是nodejs代码
const getRank = (option, logs = {}) => new Promise(async (resolve, reject) => {
  try {
    let { offset, limit } = option;
    if (!limit) limit = 10;
    const result = await sequelize.query(
      `SELECT table2.student_id,
              s.canvasser_name,
              l.level_name,
              table2.total_score
       FROM (SELECT table1.student_id,
                    sum(table1.max_score) total_score
             FROM (SELECT sq.student_id,
                   max(sq.score) max_score
                   FROM public.student_quiz sq
                   GROUP BY sq.quiz_id, sq.student_id) table1
             GROUP BY table1.student_id) table2
       INNER JOIN public.student s
               ON s.id = table2.student_id
       INNER JOIN public.level l
               ON l.id = s.level_id
       ORDER BY table2.total_score DESC
       LIMIT 10;`,
      { plain: true }
    );

    return resolve(result);
  } catch (error) {
    let customErr = error;
    if (!error.code) customErr = Helpers.customErrCode(error, null, undefinedError);
    logger.error(logs);
    return reject(customErr);
  }
});
这是使用上述函数的代码
const getRankController = async (req, res) => {
  try {
    const { offset, limit } = req.query;
    const result = await getRank({ offset, limit });

    if (result.length < 1) {
      return Helpers.response(res, {
        success: false,
        message: 'cannot get score list'
      }, 404);
    }

    return Helpers.response(res, {
      success: true,
      result
    });
  } catch (error) {
    return Helpers.error(res, error);
  }
};
与此同时,我正在尝试另一种使用内置函数 sequelize 的方法,这里是代码。
const getRank = (
  option,
  logs = {}
) => new Promise(async (resolve, reject) => {
  try {
    // eslint-disable-next-line prefer-const
    let { offset, limit } = option;
    if (!limit) limit = 10;
    const result2 = await StudentQuiz.findAll({
      attributes: ['studentId', [sequelize.fn('sum', sequelize.fn('max', sequelize.col('score'))), 'totalPrice'], 'quizId'],
      group: 'studentId',
      include: [
        {
          model: Student,
          include: [{
            model: Level
          }],
        },
      ],
      offset,
      limit
    });
    
    return resolve(result2);
  } catch (error) {
    let customErr = error;
    if (!error.code) customErr = Helpers.customErrCode(error, null, undefinedError);
    logger.error(logs);
    return reject(customErr);
  }
});
这个不起作用,因为它是嵌套函数,我有点不明白如何重现它。
我尝试做一些简单的查询,比如 SELECT * FROM table,它返回一行,然后我发现我需要在表名中添加“public”,这样它就变成了 SELECT * FROM public.table 并且它可以工作出去。好吧,直到我尝试第二个代码块中的代码。
任何答案或建议将不胜感激,谢谢。

最佳答案

我想您需要指明查询类型并删除 plain: true像这样的选项:

const result = await sequelize.query(
      `SELECT table2.student_id,
              s.canvasser_name,
              l.level_name,
              table2.total_score
       FROM (SELECT table1.student_id,
                    sum(table1.max_score) total_score
             FROM (SELECT sq.student_id,
                   max(sq.score) max_score
                   FROM public.student_quiz sq
                   GROUP BY sq.quiz_id, sq.student_id) table1
             GROUP BY table1.student_id) table2
       INNER JOIN public.student s
               ON s.id = table2.student_id
       INNER JOIN public.level l
               ON l.id = s.level_id
       ORDER BY table2.total_score DESC
       LIMIT 10;`,
      { 
        type: Sequelize.QueryTypes.SELECT
      }
    );
来自 Sequelize 文档:
options.plain - Sets the query type to SELECT and return a single row

关于javascript - Sequelize 查询 SELECT * FROM Table 只返回一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62710041/

相关文章:

javascript - 如何处理具有优先级的事件委托(delegate)?

node.js - 使用 Mongodb 创建渐进式过滤器($or + $and)

javascript - node.js + sequelize + 顺序执行

node.js - Azure AD Oauth2 隐式授予多个范围

javascript - 为什么 Object.prototype.toString.call() 给出的输出与 Object.prototype.toString() 不同?

javascript - 未调用光标更改按钮

MySQL 显示实际事件

sql - 在 Go 数据库/sql 包中查看带参数的查询

sql - 如何在一个查询中显示与所有反馈相关的所有标签

javascript - Backbonejs路由区分大小写问题