如何使用express.js在另一个MySQL查询中执行mySQL查询

时间:2019-01-02 17:56:37

标签: javascript mysql express

当我们要执行从另一个查询中获取输出的查询时,会遇到问题。

connection.query(`SELECT * from Database.table1`, function (err, rows, fields) {


        for (var item of rows) {
            allcounts += item.count
            number = item.number          
            console.log(allcounts)
            console.log(number)
            
            
            connection.query(`DELETE from Database.table2 where numbers = ${number}`, function (err, rows, fields) {

                console.log("delete successfull")
                

            })
            console.log("Step One finished !")
        }

        
    })

它应该工作的方式是,第一个查询中的行返回两个JSON对象。每个对象代表具有计数(计数)和产品编号(数字)的特定产品。该产品应在数据库的另一个表中删除。

您可以看到我们想要遍历第一条语句的输出(行),并使用此输出(行)执行另一条语句。这行得通,但express是在错误的方向执行代码...

在这里输出:

0.89
12345
Step One finished!
2.28
32598
Step One finished!
delete successfull
delete successfull

它向我们显示了数字,并正确地增加了计数! 奇怪的是,两个查询都在两个计数加完并显示数字之后才执行。

我们尝试了几种解决方案,但没有一个适合我们。

如果有人能尽快帮助我们,那就太好了:)

2 个答案:

答案 0 :(得分:0)

问题是您的for循环在继续下一次迭代之前不会等待 asynchronous public static byte[] NV21toYUV420Planar(byte[] input, byte[] output, int width, int height) { final int frameSize = width * height; final int qFrameSize = frameSize/4; System.arraycopy(input, 0, output, 0, frameSize); // Y byte v, u; for (int i = 0; i < qFrameSize; i++) { v = input[frameSize + i*2]; u = input[frameSize + i*2 + 1]; output[frameSize + i + qFrameSize] = v; output[frameSize + i] = u; } return output; } 完成。
您可以使用promises解决该问题。

我在下面包含了一些使用诺言的注释示例代码
(未经测试,因此您可能不得不解决一个错误)。

注意:

  • 我认为循环中的第二个查询没有意义。
    最好在单个查询中完成所有操作。
  • 到处搜索并阅读using promises
    了解基本知识后,您会感到很高兴。

connection.query()

答案 1 :(得分:0)

You can try with 2 solutions other than promises

1) using anonymous function which blocks the for loop for next iteration untill the query is executed

connection.query(`SELECT * from Database.table1`, function (err, rows, fields) {


        for (var item of rows) {

           (function (item){


           allcounts += item.count
            number = item.number          
            console.log(allcounts)
            console.log(number)


            connection.query(`DELETE from Database.table2 where numbers = ${number}`, function (err, rows, fields) {

                console.log("delete successfull")


            })
            console.log("Step One finished !")
            })(item);


        }


    })


2) using IN in where clause


at takes the output from another query.

connection.query(`SELECT * from Database.table1`, function (err, rows, fields) {


       let numbers = [];

        for (var item of rows) {

            numbers.push(item.number);
            }


            connection.query(`DELETE from Database.table2 where numbers IN ("+numbers+")`, function (err, rows, fields) {
                connection.release();
                console.log("delete successfull")


            })
            console.log("Step One finished !")



    })