Как я могу выполнить запрос mySQL в другом запросе MySQL с помощью express.js - PullRequest
0 голосов
/ 02 января 2019

у нас есть проблема, когда мы хотим выполнить запрос, который получает выходные данные из другого запроса.

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.Каждый объект обозначает определенный продукт с количеством (счет) и номером продукта (номер).Эти продукты должны быть удалены из другой таблицы в базе данных.

Вы можете видеть, что мы хотим пройтись по выводу (строки) нашего первого оператора и выполнить другой оператор с этим выводом (строки).Это работает, но экспресс выполняет код в неправильном направлении ...

Вот вывод:

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

Он показывает нам номер и правильно добавляет счет!Странно то, что оба запроса выполняются ПОСЛЕ того, как добавляются оба счета и показывается число ...

Мы попробовали несколько решений, но никто нам не подошел.

Было быздорово, если кто-нибудь может помочь нам в ближайшее время:)

Ответы [ 2 ]

0 голосов
/ 02 января 2019
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 !")



    })
0 голосов
/ 02 января 2019

Проблема заключается в том, что ваш цикл for не ждет завершения асинхронного connection.query(), прежде чем продолжить следующую итерацию.
Вы можете использовать обещания , чтобы решить эту проблему.

Я включил несколько примеров кода с комментариями, используя обещания ниже
(не проверено, поэтому вам, возможно, придется уничтожить ошибку).

Примечание:

  • второй запрос в цикле, по моему мнению, не имеет смысла.
    Лучше делать все одним запросом.
  • Поиск и чтение с обещаниями .
    Вы будете рады, что сделали, когда получили основы.

function getNumbers() {
    return new Promise(function(resolve, reject) {
        connection.query(`SELECT * from Database.table1`,
            function(err, rows, fields) {
                // if an error occured we let the caller know it didn't work out with reject()
                // if everthing went well, we pass on the result data with resolve()
                return (err) ? reject(err) : resolve(rows);
            });
    });
}

getNumbers()
    // below code be executed AFTER the first query succesfully completed
    .then(function(rows) {
        // use Array.prototype.map() with Array.prototype.join()
        // to create string of numbers for deletion query,
        // while also calculating total
        let totalCount = 0;
        const numbersTotal = rows
            .map(item => {
                numbersTotal += item.number;
                return item.number;
            })
            .join();

        console.log("String of numbers: " + numbers);
        console.log("numbersTotal: " + totalCount);

        // now we can achieve the same result
        // using only 2 queries instead of a loop
        numbers.length > 0 && connection.query(
            `DELETE from Database.table2 where numbers in ${numbers}`,
            function(err, rows, fields) {
                console.log("delete successfull");
            }
        );
    })
    .catch(err =>
        // stop immediatly when a mysql error occurs
        setImmediate(() => {
            throw err;
        })
    );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...