Sql запрос как удалить из строк нужную сумму

12
seosniks
На сайте с 13.08.2007
Offline
389
567

Добрый день, форумчане.

Подскажите пожалуйста как лучше сделать?

Создается ордер на   покупку  100 монет.

Но так как в базе   суммы   разные , необходимо брать  каждую строку пока не станет 100..

пример.

в таблице      table    есть   столбец    summ

id 1   summ 15

id2   summ 25

id 3   summ 115

 Общее значение summ 155


Мне необходим    запрос  чтоб     вычесть    110  из      имеющихся строк 

Проще говоря      останется    в id 1 = 0     id  2  = 0      id 3  = 45

как  реализовать      данный запрос? 

 








W1
На сайте с 22.01.2021
Offline
283
#1
seosniks :

Мне необходим    запрос  чтоб     вычесть    110  из      имеющихся строк  order by id

Проще говоря      останется    в id 1 = 0     id  = 0      id 3  = 45

Нифига это не проще, скорее непонятнее.

Мой форум - https://webinfo.guru –Там я всегда на связи
seosniks
На сайте с 13.08.2007
Offline
389
#2
webinfo #:

Нифига это не проще, скорее непонятнее

Задача удалить    из таблицы   100   монет,         после всех операций останется  70 монет   в  (7,  70); 

CREATE TABLE IF NOT EXISTS `t` (

`id` int(25) NOT NULL,

`summa` int(100) NOT NULL,

UNIQUE KEY `id` (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- Дамп данных таблицы `t`

INSERT INTO `t` (`id`,  `summa`) VALUES

(1, 30),

(5,  50),

(6,  10),

(7,  80); 

L
На сайте с 10.02.2015
Offline
221
#3
Делайте нужное количество запросов в транзакции
Ilya74
На сайте с 12.06.2008
Offline
353
#4
Берёте любой язык программирования, делаете запрос к БД и получаете все строки, далее в цикле проходите каждую строку и вычитаете сколько нужно. Смысла городить сложные запросы и процедуры на MySQL нет.
⚡️ Хостинг и VPS в Москве, Новосибирске, Нидерландах, США ( https://x5x.host )
Aisamiery
На сайте с 12.04.2015
Offline
293
#5

У вас архитектура в БД сомнительная очень. Табличка у вас похоже на лог транзакций, тогда вам ничего не надо ни от куда отнимать, а просто добавить строку с -70.
Так же сделать какую то другую табличку от куда будете читать общее значение, и при вставке в лог транзакций обновлять и общее поле.

Если я ошибся, то почему у вас в табличке 3 записи в которые надо внести изменение? Расшарьте задачу подумаем как грамотнее реализовать, пока по вашему описанию вы придумываете костыль. Как минимум непонятно зачем вам три строки, а не одна.

Разработка проектов на Symfony, Laravel, 1C-Bitrix, UMI.CMS, OctoberCMS
seosniks
На сайте с 13.08.2007
Offline
389
#6
Aisamiery #:

У вас архитектура в БД сомнительная очень. Табличка у вас похоже на лог транзакций, тогда вам ничего не надо ни от куда отнимать, а просто добавить строку с -70.
Так же сделать какую то другую табличку от куда будете читать общее значение, и при вставке в лог транзакций обновлять и общее поле.

Если я ошибся, то почему у вас в табличке 3 записи в которые надо внести изменение? Расшарьте задачу подумаем как грамотнее реализовать, пока по вашему описанию вы придумываете костыль. Как минимум непонятно зачем вам три строки, а не одна.

это просто выше  я  дал  пример для понимания.

Просто думал есть   какой  нибудь запрос получить сразу    строки с нужным числом.

SELECT *  FROM `t`   WHERE `summ` =50    LIMIT 0 , 30    выберет  конкретные  значения где есть   50

Мне же просто нужно получить  именно  мою сумму.

Если  есть три строки, пусть это будет  3 человека.

Каждый имеет   50 рублей, мне нужно  занять  120 рублей, но  у одного нет такой суммы, по этому  у первого  и второго,

забираем в долг все деньги что есть. А у третьего берем  не достающие 20,  а 30  остается у третьего.

seosniks
На сайте с 13.08.2007
Offline
389
#7
Ilya74 #:
Берёте любой язык программирования, делаете запрос к БД и получаете все строки, далее в цикле проходите каждую строку и вычитаете сколько нужно. Смысла городить сложные запросы и процедуры на MySQL нет.

Да получить все строку не проблема, просто  думал реализовать как проще.  Но похоже проще не получится. )))


выбрать все циклом   вообще не сложно.  

$result = $mysqli->query('SELECT * FROM `t`'); // запрос на выборку

while($row = $result->fetch_assoc())// получаем все строки в цикле  

{ }

Придется построчно обрабатывать,   хотел одним запросом   у первого    и второго запроса  будет 0

а третьему придется минусовать и возвращать остаток.

LEOnidUKG
На сайте с 25.11.2006
Offline
1723
#8

Придется построчно обрабатывать,   хотел одним запросом   у первого    и второго запроса  будет 0

а третьему придется минусовать и возвращать остаток.

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

Делаются транзакции и лог всех действий (+/-), и уже потом по ним баланс подбивается. 

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/
Ilya74
На сайте с 12.06.2008
Offline
353
#9
seosniks #:

Мне же просто нужно получить  именно  мою сумму.

Если  есть три строки, пусть это будет  3 человека.

Каждый имеет   50 рублей, мне нужно  занять  120 рублей, но  у одного нет такой суммы, по этому  у первого  и второго,

забираем в долг все деньги что есть. А у третьего берем  не достающие 20,  а 30  остается у третьего.

У вас структура БД для такой задачи ужасная. Никто так не делает. Делайте как вам выше советовали одну таблицу с балансом пользователей, а другую таблицу с транзакциями. В первую записываете итоговый баланс пользователя после манипуляций, а во вторую прибавления и вычитания по пользователю. Сами транзакции делаете на PHP, либо через процедуры и функции MySQL (но так в разы сложнее).

seosniks
На сайте с 13.08.2007
Offline
389
#10
LEOnidUKG #:

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

Делаются транзакции и лог всех действий (+/-), и уже потом по ним баланс подбивается. 



Это делает для  личного использования, а таблица взята из сети для примера.

В таблице лежит сумма, в каждой строке сумма разная.

Задача  набрать сумму и удалить пустые строки в таблице.




Решил с помощью PHP задачу.

Хотя насколько  оно  правильно не знаю.

Делается запрос в базу, выбирается   в цикле весь столбец   (id   и   summ )   , к сожалению как выбрать  именно нужное количество строк я не знаю.

Дальше в цикле проверяю  нужную сумму в каждой строке.  пример ниже

id   autoincrement      summ ячейка  данных      

Необходимо 120

(id 1 summ= 1) от 120-1=119 UPDATE `test2022`.`t2` SET `summ` = '0' WHERE `t`.`summ` = 1

(id 2 summ= 3) от 119-3=116 UPDATE `test2022`.`t2` SET `summ` = '0' WHERE `t`.`summ` = 3

(id 3 summ= 5) от 116-5=111 UPDATE `test2022`.`t2` SET `summ` = '0' WHERE `t`.`summ` = 5

(id 4 summ= 7) от 111-7=104 UPDATE `test2022`.`t2` SET `summ` = '0' WHERE `t`.`summ` = 7

(id 5 summ= 10) от 104-10=94 UPDATE `test2022`.`t2` SET `summ` = '0' WHERE `t`.`summ` = 10

(id 6 summ= 15) от 94-15=79 UPDATE `test2022`.`t2` SET `summ` = '0' WHERE `t`.`summ` = 15

(id 7 summ= 20) от 79-20=59 UPDATE `test2022`.`t2` SET `summ` = '0' WHERE `t`.`summ` = 20

(id 8 summ= 30) от 59-30=29 UPDATE `test2022`.`t2` SET `summ` = '0' WHERE `t`.`summ` = 30


Не хватает 29 монет, берем их в id = 9 

(id 9 summ= 50) от 29-50=21 UPDATE `test2022`.`t2` SET `summ` =' 21' WHERE `t`.`summ` = 50


Предложено по запросу=141




$tcrow=120; #Сумма которую нам необходимо  извлечь

 $result = $mysqli->query('SELECT `t2`.`id`,`t2`.`summ` FROM `t2`  where id  order by id asc '); 
while($row = $result->fetch_assoc())// получаем все строки в цикле по одной
  {
            $id   =   $row['id'] ;
            $summm= $row['summ'];
                
       if( $tcrow >   $summm){
                $quer= "UPDATE `test2022`.`t2` SET `summ` = '0' WHERE `t`.`summ` = ".  $row['summ'];
         }
         else
           {
          
               if( $tcrow <  $summm){
                  $quer= "UPDATE `test2022`.`t2` SET `summ` =' $tcrow' WHERE `t`.`summ` = ".  $row['summ'];
                     if( $tcrow <  $summm){ break;}
                    }
              }
       }

Работает  нормально, но еще необходимо сделать   чтоб выбирать не  весь столбец, а диапазон.   

Но тут думаю сделать условие where  summ <    $tcrow;

Выборка произойдет   до суммы не превышающей запрошенную.


Проверил  сумму   0.00012


Необходимо 0.00012


Не хватает 0.00012 монет, берем их в id = 1

(id 1 summ= 1) от 0.00012-1=0.99988 UPDATE `test2022`.`t2` SET `summ` =' 0.99988' WHERE `t`.`summ` = 1


Предложено по запросу=1



12

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