@vetsmen

Сложный запрос mysql в node.js?

Работаю с этой библиотекой: https://github.com/mysqljs/mysql
Хочу сделать два mysql запроса в одном, делаю так:
connection.query('INSERT INTO Items SET ?', {itemid: 'SELECT MAX(`itemid`) FROM `Items`', title: data.title, type: data.group}).then(function(result){
                console.log(result);
            }).catch(function(error){
                console.log(error);
            });

Заброс отправляется успешно, однако itemid, как я понял, не отрабатывает, и в таблицу он не доходит.
Более чем уверен что я что-то не так делаю в самом запросе, что так делать нельзя. В документации сложные запросы я не нашел. Как быть?
  • Вопрос задан
  • 1293 просмотра
Решения вопроса 1
0xD34F
@0xD34F
Ваш запрос после подстановки значений выглядит как-то так:

INSERT INTO Items SET `itemid` = 'SELECT MAX(`itemid`) FROM `Items`', ...

То есть, код запроса для получения значения itemid оказывается взят в кавычки - никакого запроса не происходит, в itemid пишется строка. Что, по-видимому, является причиной ошибки - itemid, это ведь число, да? Как сделать вставку sql кода в запрос из переменной я сам без понятия, и вообще не уверен, что такое можно сделать.

Кроме того, есть и другая проблема. Если вы попробуете вручную выполнить ваш запрос (через phpmyadmin или ещё как), то получите сообщение о синтаксической ошибке - получение значения itemid следует окружить круглыми скобками:

(SELECT MAX(`itemid`) FROM `Items`)

Ладно, поставили скобки. Теперь-то всё хорошо? Никак нет - получаем ошибку "You can't specify target table 'Items' for update in FROM clause". Корректная вставка в таблицу с получением данных из этой же таблицы будет выглядеть примерно так:

INSERT INTO Items(itemid, title, type)
SELECT MAX(itemid), <значение для title>, <значение для type> FROM Items

В общем, попробуйте что-нибудь вроде этого:

connection.query('INSERT INTO Items(itemid, title, type) SELECT MAX(itemid), ?, ? FROM Items', [ data.title, data.group ])
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы