我正在使用 react 和 express 做一个副项目。
我想在列表中发送数据库中特定项目的 7 天拖放数据以供搜索。
所以我像这样写代码。
使用date(droped_at) = date(date_add(now(),interval -*${i}* DAY)
和 for 循环。
for (var i = 1; i < 8; i++) {
var resultSql1 = `SELECT T.channel_name, T.channel_number, T.VALUE, T.num from(SELECT itemId, channel_name, channel_number, COUNT(*) AS VALUE, ROW_NUMBER() over(order by value DESC) NUM FROM item_drop_exception WHERE itemId = (SELECT itemId FROM item_exception WHERE itemid = '${id}') AND date(droped_at) = date(date_add(now(),interval -${i} DAY)) GROUP BY channel_name, channel_number) T WHERE T.NUM<=3 ORDER BY T.num ORDER BY T.NUM`
db.query(resultSql1, id, (err, data) => {
if (!err) {
list1.push(data);
if (list1.length == 7) {
res.send(list1);
}
}
else {
res.send(err);
}
})
}
但它不起作用。
我知道这种方法是错误的。
我认为在查询结果进入之前正在进行下一个循环,但我不知道该怎么办。
引入这样的七天数据对吗?
我想在所有结果都附加并完成时将数据发送到前面。
这并不容易,因为我是自学成才的,我需要帮助。
查询有一个小错误。
最后有一个双ORDER BY t.NUM
,因此当您删除它时,查询将运行。但如果它给你正确的结果,只是可以回答的,fi我们有数据
所以
var resultSql1 = `SELECT T.channel_name, T.channel_number, T.VALUE, T.num from(SELECT itemId, channel_name, channel_number, COUNT(*) AS VALUE, ROW_NUMBER() over(order by value DESC) NUM FROM item_drop_exception WHERE itemId = (SELECT itemId FROM item_exception WHERE itemid = '${id}') AND date(droped_at) = date(date_add(now(),interval -${i} DAY)) GROUP BY channel_name, channel_number) T WHERE T.NUM<=3 ORDER BY T.num`
每天都会给你一个结果
将函数调用转换为承诺,然后将其await
到每个循环中,确保每个数据库查询逐个运行。
const { promisify } = require('util');
const dbQueryAsync = promisify(db.query);
async function getData(req, res) {
var { id } = req.params;
var list = [];
for (var i = 1; i < 8; i++) {
var resultSql1 = `SELECT ... `;
try {
var data = await dbQueryAsync(resultSql1, id);
list.push(data);
} catch(err) {
res.send(err);
}
}
res.send(list);
);