powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / multi insert and where select nodejs
34 сообщений из 34, показаны все 2 страниц
multi insert and where select nodejs
    #40016196
it_crb29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день уважаемые форумчане!

Входные данные: Клиент передает на сервер json oбъект который содержит в себе массив вида (id, quantity, price)

Моя функция для того чтоб сделать insert этого массива в db:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
    static addSale(products){

        //WHERE (SELECT stock FROM prais_informations WHERE code = ) > 20;
        let quer = 'INSERT INTO `sales` (`id`, `code`, `quantity`, `price`, `sum`, `idCheck`) VALUES ?;';            

        return new Promise((resolve, reject) => {
           
        pool.getConnection((err, connection) => {
            if (err)reject(err);
            
            connection.query(quer, [products.map(item => [null, item.id, item.quantity, item.price, item.sum, 3])], (err, rows) => {
                 if (err) {
                    reject(err);
                }

                resolve(rows);
                connection.release();
            });
        });
     });
    }



Вопрос в следующем, прежде чем сделать инсерт всех строк, нужно проверить не превышает ли количество в запросе, остаток в бд, если хотя бы одна строка не удовлетворяет условию, запрос не должен быть сделан.

Я вижу три способа:

1. Доделать запрос до вида:
Код: sql
1.
INSERT INTO `sales` (`id`, `code`, `quantity`, `price`, `sum`, `idCheck`) VALUES ? WHERE (SELECT stock FROM prais_informations WHERE code = ? ) >= ?; 


2. Создать еще одну функцию, в которую передать входящий массив и вернуть true/false (т.е. разделить запрос на две части)

3. Написать процедуру в самой БД которая и будет обрабатывать входящий массив и возвращать ответ.
...
Рейтинг: 0 / 0
multi insert and where select nodejs
    #40016198
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
it_crb29
Код: sql
1.
VALUES ? WHERE

Так не бывает. Бывает INSERT ... SELECT ...
...
Рейтинг: 0 / 0
multi insert and where select nodejs
    #40016199
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я за то, чтобы делать одним запросом. В противном случае возможны трудноуловимые глюки из-за конкурентных сессий.
...
Рейтинг: 0 / 0
multi insert and where select nodejs
    #40016200
it_crb29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,
что о вроде этого:
Код: sql
1.
2.
3.
insert into orders (product_id, qty)
select 2, 20
where (SELECT qty_on_hand FROM products WHERE id = 2) > 20;
...
Рейтинг: 0 / 0
multi insert and where select nodejs
    #40016201
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
it_crb29,

Да, что-то вроде этого.
Только я бы еще предложил все вставляемые записи в один запрос поместить.
...
Рейтинг: 0 / 0
multi insert and where select nodejs
    #40016202
it_crb29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,

так они и так ведь упаковываются в один запрос, т.е. получается что то вроде:

Код: sql
1.
2.
3.
4.
5.
INSERT into orders (product_id, qty)
VALUES (2, 10, 100), ..., (id, qty, price)
WHERE (SELECT qty_on_hand FROM products WHERE id = 2) > 20 
AND (SELECT qty_on_hand FROM products WHERE id = 3) > 30 
AND (SELECT qty_on_hand FROM products WHERE id = 4) > 40;
...
Рейтинг: 0 / 0
multi insert and where select nodejs
    #40016203
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
it_crb29
так они и так ведь упаковываются в один запрос
Возможно, не спорю. Просто показанный код мне понятен только в SQL-части.
...
Рейтинг: 0 / 0
multi insert and where select nodejs
    #40016204
it_crb29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,

Буду думать как к каждому фрагменту insert приделать условие
...
Рейтинг: 0 / 0
multi insert and where select nodejs
    #40016205
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
it_crb29
miksoft,

Буду думать как к каждому фрагменту insert приделать условие
Зачем? Вам же нужно "если хотя бы одна строка не удовлетворяет условию, запрос не должен быть сделан". Это у вас уже есть.
...
Рейтинг: 0 / 0
multi insert and where select nodejs
    #40016206
it_crb29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,

вот это пример с mysqltutorial:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
// insert statment
let stmt = `INSERT INTO sales(`id`, `code`, `quantity`, `price`, `sum`, `idCheck`)  VALUES ?  `;

let todos = [
  [null, id, quantity, price, sum],
  [null, id1, quantity1, price1, sum1],
  [null, id2, quantity2, price2, sum2],
];

// execute the insert statment
connection.query(stmt, [todos], (err, results, fields) => {
  if (err) {
    return console.error(err.message);
  }
  // get inserted rows
  console.log('Row inserted:' + results.affectedRows);
});



Если бы это быа строка, тогда все ясно, но здесь массив.
...
Рейтинг: 0 / 0
multi insert and where select nodejs
    #40016247
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
it_crb29,

Если у вас уже есть массив записей (т.е. таблица), вам осталось преобразовать его в тип recordset* и обращаться с ним как с SQL таблицей, с которой вы уже знакомы.

Я плохо знаком с MySQL, в Оракл это преобразование выглядело бы так: TABLE(todos).

После этого работают SQL команды: "select * from TABLE(todos) where..."

В вашем примере, в котором я понял вы хотите оформить заказ продаж на товары в наличии (верно?)
В передаваемом массиве содержится один заказ на все товары, что желает покупатель.
Когда товаров много, все понятно.

Что должно случиться, когда товара не хватает по одной позиции? Наверное, один из трех:
1) весь заказ отменяется
2) заказ выполняется по другим позициям, отменяется часть по дефициту
3) заказ выполняется максимально, с уменьшенными количествами по дефициту
...
Рейтинг: 0 / 0
multi insert and where select nodejs
    #40016249
it_crb29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
НеофитSQL,

да, все верно. В моем случае, заказ не должен быть выполнен, запрос не должен быть выполнен.

Я полагаю, учитывая, к сожалению, мой скромные познания в sql, что дополнить надлежащим образом нижеследующий запрос невозможно и для решения проблемы нужно или

1 . Писать еще одну функцию, которая сравнит передаваемое количество с остатком для каждого поля заказа и вернет промис.
2 . Сделать все это в процедуре.

Код: sql
1.
2.
3.
4.
5.
6.
7.
1
INSERT INTO `sales` (`id`, `code`, `quantity`, `price`, `sum`, `idCheck`)
VALUES
(null, item.id, item.quantity, item.price, item.sum, 3),
(null, item.id, item.quantity, item.price, item.sum, 3)
, ... ,
(null, item.id, item.quantity, item.price, item.sum, 3);
...
Рейтинг: 0 / 0
multi insert and where select nodejs
    #40016250
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
it_crb29,

используя синтакс TABLE(todos), я бы написал что-то такое:

Код: sql
1.
2.
3.
4.
5.
6.
7.
select count(*) into n 
  from TABLE(todos) d
  join products p on d.product_id = p.id
 group by d.product_id
having sum(d.qty) > p.qty_on_hand;

  if n > 0 ... отмена заказа



Вы умеете читать/писать SQL джойны? Они тут нужны, чтобы связать запрос с таблицей товаров, где находится их количество.
"group" я добавил на тот случай, если в JSON объекте есть повторения товаров, например клиент-филолог заказал четыре кочерги, а потом еще две в отдельной строчке.

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

Чтобы такого не случилось, нужно или применить логику резерваций (одновременно с проверкой на наличие вычитается товар из инвентаря), или применить строгую очередность заказов, где следующий заказ не может появиться пока не закончился предыдущий.

Для максимальной скорости исполнения заказов, первый подход лучше. Я предпочитаю второй подход для моих неторопливых задач, т.к. первый сложнее в исполнении, и требует бОльшего опыта для безошибочной реализации, чем сейчас у меня есть.
...
Рейтинг: 0 / 0
multi insert and where select nodejs
    #40016253
it_crb29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
НеофитSQL,

LEFT JOIN умею, завтра займусь, спасибо за ответы.
...
Рейтинг: 0 / 0
multi insert and where select nodejs
    #40016312
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Если у вас уже есть массив записей (т.е. таблица), вам осталось преобразовать его в тип recordset* и обращаться с ним как с SQL таблицей, с которой вы уже знакомы.

Я плохо знаком с MySQL, в Оракл это преобразование выглядело бы так: TABLE(todos).
В MySQL нет ни массивов, ни конструкций вида TABLE(todos).
...
Рейтинг: 0 / 0
multi insert and where select nodejs
    #40016504
it_crb29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,

Не придумал ничего умнее чем в цикле создать запрос вида

Код: sql
1.
2.
3.
SELECT true WHERE (SELECT prais_informations.stock FROM prais_informations WHERE prais_informations.code = 1 LIMIT 1) > 7 
UNION
SELECT true WHERE (SELECT prais_informations.stock FROM prais_informations WHERE prais_informations.code = 2 LIMIT 1) > 3



вернуть промис и на основе ответа делать/не делать запрос insert.

П.С. Выглядит убого.
...
Рейтинг: 0 / 0
multi insert and where select nodejs
    #40016513
it_crb29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
it_crb29,

П.С, пошел смотреть продвинутый курс по mysql, бех этих знаний не обойтись.
...
Рейтинг: 0 / 0
multi insert and where select nodejs
    #40016537
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
it_crb29 , что-то Вы явно не то делаете. Теоретически нужно просто передать объект на MySQL как есть, а там его распарсить и разложить по клеточкам.

it_crb29
Входные данные: Клиент передает на сервер json oбъект который содержит в себе массив вида (id, quantity, price)

it_crb29
сделать insert этого массива в db

Выложите:
1. Пример JSON-объекта в том виде, в каком он поступает от клиента (3-4 записи достаточно).
2. CREATE TABLE таблицы-приёмника, в которую нужно поместить эти данные, и, если в зависимости от данных в JSON могут потребоваться как INSERT, так и UPDATE, дополнительно INSERT INTO 2-3 уже имеющихся записей.
3. Итоговый результат, который требуется получить (таблицей).
4. Точную версию MySQL.
...
Рейтинг: 0 / 0
multi insert and where select nodejs
    #40016552
it_crb29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

1. C клиента приходит:
Код: javascript
1.
2.
3.
4.
sales:  [
  { id: 2, quantity: 5, price: 123, sum: 615 },
  { id: 1, quantity: 9, price: 97, sum: 873 }
]



2. sales : таблица в которую просто идет запись(тот самый мульти инсерт, c этой таблицей ничего сравнивать не нужно, в неё только запись)

table sales

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE TABLE `sales` (
  `id` int UNSIGNED NOT NULL,
  `code` int UNSIGNED NOT NULL,
  `quantity` mediumint UNSIGNED NOT NULL,
  `price` decimal(7,2) NOT NULL,
  `sum` decimal(8,2) NOT NULL,
  `idCheck` int UNSIGNED NOT NULL,
  `data` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8;




3. prais_information AS pi : таблица в которой лежат остатки

Соответственно pi.code === id and pi.stock >= quantity

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE TABLE `prais_informations` (
  `id` mediumint UNSIGNED NOT NULL,
  `code` mediumint UNSIGNED NOT NULL,
  `stock` mediumint UNSIGNED NOT NULL,
  `price` decimal(7,2) NOT NULL,
  `trade_price` decimal(7,2) NOT NULL,
  `group_in_tree` smallint UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;



pi

4. mysql: mysql Ver 8.0.22 for Linux on x86_64 (MySQL Community Server - GPL)

5. В итоге записи в sales делаются только тогда когда товара достаточно т.е. pi.stock >= quantity , если хотя бы одного товара не достаточно, ничего не записывается.
...
Рейтинг: 0 / 0
multi insert and where select nodejs
    #40016558
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С точки зрения MySQL такой JSON - невалидный.

Надеюсь, преобразовать ЭТО в формат
Код: sql
1.
2.
3.
4.
[
  { "id": 2, "quantity": 5, "price": 123, "sum": 615 },
  { "id": 1, "quantity": 9, "price": 97, "sum": 873 }
]

не составит проблемы?
...
Рейтинг: 0 / 0
multi insert and where select nodejs
    #40016562
it_crb29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Код: javascript
1.
2.
3.
4.
sales:  [
  { id: 2, quantity: 5, price: 123, sum: 615 },
  { id: 1, quantity: 9, price: 97, sum: 873 }
]



Эти данные у меня приходят на сервер nodejs. C nodejs я преобразую и отправлю на сервер mysql так, как это необходимо.
...
Рейтинг: 0 / 0
multi insert and where select nodejs
    #40016564
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В таблице sales имеются поля code и idCheck , которые NOT NULL и не имеют DEFAULT. В JSON их нет.

Откуда берутся их значения?
...
Рейтинг: 0 / 0
multi insert and where select nodejs
    #40016567
it_crb29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

id === code, idCheck - на данный момент это пока константа(любое число)

Для удобства, входящие данные можем заменить на:

Код: javascript
1.
2.
3.
4.
[
  { "code": 2, "quantity": 5, "price": 123, "sum": 615 },
  { "code": 1, "quantity": 9, "price": 97, "sum": 873 }
]
...
Рейтинг: 0 / 0
multi insert and where select nodejs
    #40016572
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, любуйтесь и разбирайтесь: fiddle .
...
Рейтинг: 0 / 0
multi insert and where select nodejs
    #40016577
it_crb29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Ваши sql запросы, как всегда, неотразимы, передавать на mysql server json массив и там его парсить, я даже не знал, что так можно...
Спасибо за пример, я обязательно разберу и буду передавать из nodejs в mysql json, а не готовый мульти запрос.

Однако мой вопрос по сути сводился к следующему: я не могу сделать ни один insert пока не проверю что в pi есть достаточное количество quantity, т.е.
pi.quantuty >= $.quantity

Проще говоря, если на складе чего то не хватает, то заказ не принимается.
...
Рейтинг: 0 / 0
multi insert and where select nodejs
    #40016583
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
it_crb29
мой вопрос по сути сводился к следующему: я не могу сделать ни один insert пока не проверю что в pi есть достаточное количество quantity, т.е.
pi.quantuty >= $.quantity

Проще говоря, если на складе чего то не хватает, то заказ не принимается.

Ну так парсим во временную таблицу, запросом проверяем наличие. Если есть - копируем данные из временной таблицы в рабочую, если нет - просто дропаем временную таблицу и выдаём отказ.

В любом случае после парсинга данные уже на сервере, и можно проверять хоть скопом, хоть по одной записи - по вкусу.
...
Рейтинг: 0 / 0
multi insert and where select nodejs
    #40016649
it_crb29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Да, именно так, спасибо за подробное разъяснение, еще раз, мое почтение вашему идеальному sql. Начну просмотр курса sql на юдеми, после просмотра вернусь к задаче.
...
Рейтинг: 0 / 0
multi insert and where select nodejs
    #40017798
it_crb29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
it_crb29,

Прикладываю процедуру, которую сделал на данный момент, из проблем insert в таблицу sales проходит, но пропускается один индекс (скрин).
Так же подскажите как правильно обновить остатки на складах, что то вроде (stackoverflow)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
You can use a CASE statement to handle multiple if/then scenarios:

UPDATE table_to_update 
SET  cod_user= CASE WHEN user_rol = 'student' THEN '622057'
                   WHEN user_rol = 'assistant' THEN '2913659'
                   WHEN user_rol = 'admin' THEN '6160230'
               END
    ,date = '12082014'
WHERE user_rol IN ('student','assistant','admin')
  AND cod_office = '17389551';



Процедура:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
BEGIN

DECLARE res INT;
DECLARE last_index INT;
SET @input := 'sales:  [  { id: 2, quantity: 5, price: 123, sum: 615 },  { id: 1, quantity: 9, price: 97, sum: 873 } ]';

SET @input:=REPLACE(@input, ' ', '');
SET @input:=REPLACE(@input, 'sales:', '');
SET @input:=REGEXP_REPLACE(@input, '([{,])([a-z])', '$1"$2');
SET @input:=REGEXP_REPLACE(@input, '([a-z]):', '$1":');

CREATE TEMPORARY TABLE new_tbl SELECT jtin.id AS jtin_id, jtin.quantity AS jtin_qty, pi.stock AS pi_qty, pi.price AS pi_price
FROM JSON_TABLE(@input,
                "$[*]"
                COLUMNS (id INT PATH "$.id" ,
                         quantity MEDIUMINT PATH "$.quantity",
                         price DECIMAL(7,2) PATH "$.price",
                         `sum` DECIMAL(8,2) PATH "$.sum"
                         )) AS jtin 
                LEFT JOIN prais_informations AS pi ON jtin.id  = pi.code;

SET res = (SELECT count(*) FROM new_tbl WHERE jtin_qty > pi_qty);

IF res = 0 THEN 
/*
  Инсертим новую запись, получившийся id, будет являтся id чека
*/
INSERT INTO checks(`data`, `user`) VALUES ( UNIX_TIMESTAMP(), 0);
SET last_index = (SELECT max(id) FROM checks);
/*
  Инсертим содержимое массива заказа в таблицу регистрации
*/
INSERT INTO sales(`code`, `quantity`, `price`, `sum`, `idCheck`) SELECT nt.jtin_id, nt.jtin_qty, nt.pi_price, (nt.jtin_qty * nt.pi_price), last_index FROM new_tbl AS nt;

/*
  Обновляем остатки на складе
*/

END IF

END
...
Рейтинг: 0 / 0
multi insert and where select nodejs
    #40017810
it_crb29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
it_crb29,

Как вариант можно сделать триггер на insert в sales и делать update в price_information.
...
Рейтинг: 0 / 0
multi insert and where select nodejs
    #40017823
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
it_crb29
пропускается один индекс (скрин)

Это - таблица sales ? ну так, чисто по набору полей... тогда актуализируйте структуру - у Вас выше в коде id вот ни разу не автоинкремент, а значения туда чем-то надуло...

А если автоинкремент - то Вас вообще его значение не должно волновать.

it_crb29
Код: sql
1.
2.
INSERT INTO checks(`data`, `user`) VALUES ( UNIX_TIMESTAMP(), 0);
SET last_index = (SELECT max(id) FROM checks);


А вот это вообще-то - безобразие... достаточно одного конкурентного процесса, чтобы получить кашу.
...
Рейтинг: 0 / 0
multi insert and where select nodejs
    #40017826
it_crb29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
Вот sales:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
CREATE TABLE `sales` (
  `id` int UNSIGNED NOT NULL,
  `code` int UNSIGNED NOT NULL,
  `quantity` mediumint UNSIGNED NOT NULL,
  `price` decimal(7,2) NOT NULL,
  `sum` decimal(8,2) NOT NULL,
  `idCheck` int UNSIGNED NOT NULL,
  `data` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


--
ALTER TABLE `sales`
  ADD PRIMARY KEY (`id`),
  ADD KEY `idCheck` (`idCheck`);

--
ALTER TABLE `sales`
  MODIFY `id` int UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=0;



Если все дропнуть и создать занова, выполнить два раза процедуру test, я получаю в sales следующее:

screen

C max(id) чуть позже я переделаю как следует и сообщу.
...
Рейтинг: 0 / 0
multi insert and where select nodejs
    #40017856
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А давайте Вы возьмёте мой fiddle, внесёте в него изменения (обновлённую структуру, данные, процедуру, приме её выполнения), и дадите ссылку. Ну чтобы прямо сразу смотреть и вносить изменения, причём в одно и то же...

А то скриншоты - оно, конечно, красиво, но ни разу не удобно.
...
Рейтинг: 0 / 0
multi insert and where select nodejs
    #40017895
it_crb29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

fiddle
...
Рейтинг: 0 / 0
multi insert and where select nodejs
    #40018264
it_crb29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
it_crb29,

На текущий момент так, можно добавить LOCK на таблицу, у меня не выходит, по поводу пропуска значений в auto_increment, mysql гарантирует уникальность поля, но не последовательность, для послдовательности, нужно выставить innodb_autoinc_lock_mode = 0

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
BEGIN

DECLARE res INT;
DECLARE last_index INT;
SET @input := 'sales:  [  { id: 2, quantity: 5, price: 123, sum: 615 },  { id: 1, quantity: 9, price: 97, sum: 873 } ]';

SET @input:=REPLACE(@input, ' ', '');
SET @input:=REPLACE(@input, 'sales:', '');
SET @input:=REGEXP_REPLACE(@input, '([{,])([a-z])', '$1"$2');
SET @input:=REGEXP_REPLACE(@input, '([a-z]):', '$1":');

CREATE TEMPORARY TABLE new_tbl SELECT jtin.id AS jtin_id, jtin.quantity AS jtin_qty, pi.stock AS pi_qty, pi.price AS pi_price
FROM JSON_TABLE(@input,
                "$[*]"
                COLUMNS (id INT PATH "$.id" ,
                         quantity MEDIUMINT PATH "$.quantity",
                         price DECIMAL(7,2) PATH "$.price",
                         `sum` DECIMAL(8,2) PATH "$.sum"
                         )) AS jtin 
                LEFT JOIN prais_informations AS pi ON jtin.id  = pi.code;

SET res = (SELECT count(*) FROM new_tbl WHERE jtin_qty > pi_qty);

IF res = 0 THEN 

INSERT INTO checks(`data`, `user`) VALUES ( UNIX_TIMESTAMP(), 0);

SET last_index = LAST_INSERT_ID();
/*
  Инсертим содержимое массива заказа в таблицу регистрации
*/
INSERT INTO sales(`code`, `quantity`, `price`, `sum`, `idCheck`) SELECT nt.jtin_id, nt.jtin_qty, nt.pi_price, (nt.jtin_qty * nt.pi_price), last_index FROM new_tbl AS nt;

UPDATE prais_informations AS pi LEFT JOIN new_tbl ON pi.code = new_tbl.jtin_id SET pi.stock = pi.stock - new_tbl.jtin_qty;

END IF;

END
...
Рейтинг: 0 / 0
34 сообщений из 34, показаны все 2 страниц
Форумы / MySQL [игнор отключен] [закрыт для гостей] / multi insert and where select nodejs
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]