【问题标题】:Executing mysql queries sequentially nodejs顺序执行mysql查询nodejs
【发布时间】: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


【解决方案1】:

根据您上次的评论,我相信您可以通过 JOIN 实现它。有几种方法可以做到这一点,但请考虑以下示例:

SELECT * FROM owner o 
JOIN dogs d ON o.id=d.owner_id
JOIN dog_toys t ON d.id=t.dog_id
WHERE o.id=1;

假设您有 3 个表(owner、dogs 和 dog_toys)并且每个表的关系为 owner.id=dogs.owner_iddogs.id=dog_toys.dog_id,您可以在一个查询中简单地 JOIN 所有这三个表并修改返回的结果为SELECT

我在这里创建了一个示例小提琴:https://www.db-fiddle.com/f/ukBgL4M3NzkyTDC6nMGkJn/1

【讨论】:

  • 感谢您的帮助 :D 我现在明白了。
猜你喜欢
  • 2014-03-05
  • 2014-07-30
  • 2018-02-06
  • 1970-01-01
  • 2015-06-15
  • 2017-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多