我目前正在使用 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/