【发布时间】:2020-10-15 07:46:31
【问题描述】:
我对 nodejs 很陌生,我正在使用它来构建一个带有 mysql 数据库的 api,并且遇到了一个问题,我无法按顺序执行 mysql 查询。
数据库结构是三张表。表 a 与表 b 是一对多关系,而表 b 与表 c 是一对多关系。
我需要一个 GET 端点,其中提供了帮助,它返回一个结果,其中包含 b 的项目数组,其中 c 的项目数组嵌套在其中。
样本结果:
{
日志代码:“”,
日志消息:“”,
咬伤:[{
咬粒:1
引用:[{
中位数:1
} {
中位数:2
}]
}{
咬粒:2
引用:[{
中位数:3
}]
}]
}
目前我正在尝试通过首先执行一个查询来检索与接收到的实体 a 的键相对应的所有 b 类型值,然后对结果运行 foreach 循环并提取 bitem id 然后运行foreach 循环中的另一个查询,以获取具有该特定外键的表 c 的所有项目。
async function (req, res) {
let functionname = 'getAllItems'
const conLocalPool = db.conLocalPool.promise();
var data = {}
const atoken = req.get('token');
var str = ``;
str = `call ${functionname}('${atoken}')`;
console.log(str);
try {
const [rows, fields] = await conLocalPool.query(str)
data = rows[0][0]
if (data.logcode === 20100) {
data.bitems = rows[1];
data.bitems.forEach(async (bitem) => {
var stmt = `Select * from \`table-c\` where bitemid=${bitem.id}`
try {
const [citemrows, citemfields] = await conLocalPool.query(stmt);
console.log(citemrows[1])
bitem.citems = citemrows[1];
return true;
}
catch (err) {
console.log(err);
return false;
}
})
}
res.status(200).send(data);
return true;
}
catch (err) {
res.status(500).send({
error: err.message
});
return false;
}
}
使用这个函数,我可以得到一个响应,其中包含与 aitemtoken 相关的所有条目,但不包含与每个单独的条目相关的条目。
我想要一些关于如何执行第一个查询的帮助,然后根据它检索到的响应执行后面的查询。
【问题讨论】:
-
我假设后面的查询将使用第一个查询中的某些字段作为条件参考?在
WHERE ..也许? -
是的,我需要第一个查询的 id 用于后面的查询。
-
你在第一个查询条件中使用的同一个id?
-
不,第一个查询将具有从请求中接收到的 id。后面的查询将使用第一个查询返回的行中的 id。查询 1-> 返回 10 个项目,我需要运行 10 个查询,每个查询一个带有它的 id 的每个项目
-
这 10 个查询是否会运行相同的查询,仅通过 id 进行区分?比如“稍后查询1”=
SELECT * FROM table WHERE id="1",“稍后查询2”=SELECT * FROM table WHERE id="2"..等等?
标签: javascript mysql node.js async-await