Запускать mysql в таблице заказов, где orders_id совпадает с процессом обновления

Я хочу обновить статус в таблице orders = 1, когда статус в таблице orders_foods = 1, где order_id = order_id совпадает с обновлением.

CREATE TRIGGER upd_check AFTER UPDATE ON orders_foods
FOR EACH ROW
BEGIN
   IF (new.status= '1' where old.order_id=new.order_id) THEN
     update  orders 
     set status= '1'
     where old.order_id=old.order_id
   END IF;
END;

таблица заказов стол orders_foodsЗапускать mysql в таблице заказов, где orders_id совпадает с процессом обновления

Я не знаю, как записать это значение order_id в процессе обновления для запуска и сопоставления с идентификатором в таблице заказов

моя проблема решена

BEGIN
    declare od_status_1 int default 0;
    declare od_number int default 0;
    select count(*) into od_number from orders_foods where orders_foods.order_id = new.order_id;
    select count(*) into od_status_1 from orders_foods where orders_foods.order_id = new.order_id and orders_foods.status = 1;

 if od_number = od_status_1 then
   update  orders
  set status= '1'
  where id=old.order_id;
 end if;

КОНЕЦ

спасибо П. Лосось

с какой проблемой вы столкнулись сейчас?

Gaj 06.07.2018 11:58

Я не знаю, как записать это значение order_id в процессе обновления для запуска и сопоставления с идентификатором в таблице заказов

riski wahyu 06.07.2018 12:00

Что должно произойти, если в orders_foods обновляется только 1 часть заказа?

P.Salmon 06.07.2018 12:23

если только 1 статус обновления детали = 1 без обновления в таблице заказов. этот триггер запускается, только если all status = 1, где orders_foods.orders_id = orders.id

riski wahyu 06.07.2018 12:25

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

P.Salmon 06.07.2018 12:39
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
5
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Попробуй это

Delimiter //  
CREATE TRIGGER upd_check AFTER UPDATE ON orders_foods
    FOR EACH ROW
    BEGIN
       IF (new.status= 1 and old.order_id=new.order_id) THEN
         update  orders 
         set status= 1
         where id=old.order_id;
       END IF;
    END;
//
Delimiter ;

# 1064 - У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MariaDB, чтобы найти правильный синтаксис для использования рядом с 'END IF' в строке 8

riski wahyu 06.07.2018 12:12

; отсутствует в заявлении об обновлении. сейчас исправил. Проверь сейчас

Gaj 06.07.2018 12:14

Я пробовал это раньше и получил тот же # 1064 - У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MariaDB, чтобы найти правильный синтаксис рядом с '' в строке 7

riski wahyu 06.07.2018 12:15

У меня нет базы данных, поэтому я не мог проверить. Извините

Gaj 06.07.2018 12:23

СОЗДАТЬ ТАБЛИЦУ orders (id int (11) UNSIGNED NOT NULL, name varchar (150) COLLATE utf8_bin NOT NULL, phone varchar (20) COLLATE utf8_bin NOT NULL, price double NOT NULL, adress mediumtext COLLATE utf8_bin NOT NULL дата, datetimestatus int (11) NOT NULL); СОЗДАТЬ ТАБЛИЦУ orders_foods (id int (11) NOT NULL, food_id int (10) UNSIGNED NOT NULL, order_id int (10) UNSIGNED NOT NULL, price double NOT NULL, quantity int (11) NOT NULL status int (11) NOT NULL) ;

riski wahyu 06.07.2018 12:34

@gaj, возможно, вы захотите установить разделители

P.Salmon 06.07.2018 12:38

@ P.Salmon ха :) получил .. riskiwahyu надеюсь, теперь вы можете решить. Я исправил в своем ответе

Gaj 06.07.2018 12:45

этот триггер запускается. но это изменение статуса в orders = 1, когда изменяется только 1 статус orders_food.

riski wahyu 06.07.2018 13:10

Могу ли я сначала проверить этот триггер, например, выбрать статус в orders_food с тем же order_id, если status all select = 1, а затем активировать статус обновления для заказов до 1?

riski wahyu 06.07.2018 13:12

нет оператора выбора .. уже проверяется new.status = 1 (это только статус order_food). если вы говорите, что статус изменился с какого-то другого значения на 1, тогда должна обновляться только таблица заказов, а затем измените условие if на "IF (new.status = 1 and new.status <> old.status and old.order_id = new.order_id) ) ТОГДА"

Gaj 06.07.2018 13:19

возможно, как это НАЧАТЬ ЕСЛИ (new.status = 1 и new.status = old.status и new.order_id = order_id) ТОГДА обновлять заказы устанавливают статус = 1, где id = old.order_id; КОНЕЦ ЕСЛИ; КОНЕЦ

riski wahyu 06.07.2018 13:34

но у меня столбец не найден: 1054 Неизвестный столбец 'order_id' в 'списке полей' в C: \ xampp \ htdocs \ TUGASAKHIR \ admin \ Models \ Admin.php: 246

riski wahyu 06.07.2018 13:34

если status = 1, где new.order_id = order_id <все тот же order_id, тогда измените статус в order = 1

riski wahyu 06.07.2018 13:35
Ответ принят как подходящий

Если статус заказа не должен меняться до тех пор, пока все статусы order_detail не изменится на 1, возможно, что-то вроде этого

drop trigger if exists t;
delimiter $$

CREATE TRIGGER t AFTER UPDATE ON od
FOR EACH ROW
BEGIN
        declare od_number int default 0;
        declare od_status_1 int default 0;
        select count(*) into od_number from od where od.order_id = new.order_id;
        select count(*) into od_status_1 from od where od.order_id = new.order_id and od.status = 1;
    insert into debug_table(msg) values
        (concat('new status:', new.status,' od found:',od_number,' od_status_1:',od_status_1))          ;

   IF new.status= 1  THEN
    insert into debug_table (msg) values
        (concat('in status check new status:', new.status,' od found:',od_number,' od_status_1:',od_status_1)   );
     if od_number = od_status_1 then
       update  o
      set status= '1'
      where id=old.order_id;
     end if;
   END IF;
END $$

delimiter ;

Обратите внимание на использование таблицы отладки для ошибки отладки.

ariaDB [sandbox]> /*
   /*> drop table if exists o,od;
   /*>
   /*> create table o(id int,status int);
   /*> create table od(id int,order_id int,status int);
   /*> */
MariaDB [sandbox]> truncate table o;
Query OK, 0 rows affected (0.19 sec)

MariaDB [sandbox]> truncate table od;
Query OK, 0 rows affected (0.21 sec)

MariaDB [sandbox]> insert into o values
    -> (1,0),(2,0);
Query OK, 2 rows affected (0.02 sec)
Records: 2  Duplicates: 0  Warnings: 0

MariaDB [sandbox]> insert into od values
    -> (1,1,0),(2,1,0),(3,1,0),(4,2,0);
Query OK, 4 rows affected (0.05 sec)
Records: 4  Duplicates: 0  Warnings: 0

MariaDB [sandbox]>
MariaDB [sandbox]> truncate table debug_table;
Query OK, 0 rows affected (0.34 sec)

MariaDB [sandbox]> update od set od.status = 1 where od.id = 1;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0

MariaDB [sandbox]> select * from o join od on od.order_id = o.id;
+------+--------+------+----------+--------+
| id   | status | id   | order_id | status |
+------+--------+------+----------+--------+
|    1 |      0 |    1 |        1 |      1 |
|    1 |      0 |    2 |        1 |      0 |
|    1 |      0 |    3 |        1 |      0 |
|    2 |      0 |    4 |        2 |      0 |
+------+--------+------+----------+--------+
4 rows in set (0.00 sec)

MariaDB [sandbox]>
MariaDB [sandbox]> update od set od.status = 1 where od.id in (2,4);
Query OK, 2 rows affected (0.02 sec)
Rows matched: 2  Changed: 2  Warnings: 0

MariaDB [sandbox]> select * from o join od on od.order_id = o.id;
+------+--------+------+----------+--------+
| id   | status | id   | order_id | status |
+------+--------+------+----------+--------+
|    1 |      0 |    1 |        1 |      1 |
|    1 |      0 |    2 |        1 |      1 |
|    1 |      0 |    3 |        1 |      0 |
|    2 |      1 |    4 |        2 |      1 |
+------+--------+------+----------+--------+
4 rows in set (0.00 sec)

MariaDB [sandbox]>
MariaDB [sandbox]> select * from debug_table;
+----+-------------------------------------------------------+------+
| id | msg                                                   | MSG2 |
+----+-------------------------------------------------------+------+
|  1 | new status:1 od found:3 od_status_1:1                 | NULL |
|  2 | in status check new status:1 od found:3 od_status_1:1 | NULL |
|  3 | new status:1 od found:3 od_status_1:2                 | NULL |
|  4 | in status check new status:1 od found:3 od_status_1:2 | NULL |
|  5 | new status:1 od found:1 od_status_1:1                 | NULL |
|  6 | in status check new status:1 od found:1 od_status_1:1 | NULL |
+----+-------------------------------------------------------+------+
6 rows in set (0.00 sec)

MariaDB [песочница]>

СОЗДАТЬ ТРИГГЕР t ПОСЛЕ ОБНОВЛЕНИЯ orders_foods ДЛЯ КАЖДОЙ СТРОКИ НАЧАТЬ объявить od_number int default 0 получил ошибку # 1064

riski wahyu 06.07.2018 14:37

# 1146 - Таблица tugasakhir.debug_table не существует

riski wahyu 06.07.2018 15:07

хорошо, спасибо, я понял, братан, это НАЧАЛО объявить od_status_1 int default 0; объявить od_number int по умолчанию 0; выберите count () в od_number из orders_foods, где orders_foods.order_id = new.order_id; выберите количество () в od_status_1 из orders_foods, где orders_foods.order_id = new.order_id и orders_foods.status = 1; если od_number = od_status_1, то обновленные заказы устанавливают status = '1', где id = old.order_id; конец, если; КОНЕЦ

riski wahyu 06.07.2018 15:16

Другие вопросы по теме