Я хочу обновить статус в таблице 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
Я не знаю, как записать это значение 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;
КОНЕЦ
спасибо П. Лосось
Я не знаю, как записать это значение order_id в процессе обновления для запуска и сопоставления с идентификатором в таблице заказов
Что должно произойти, если в orders_foods обновляется только 1 часть заказа?
если только 1 статус обновления детали = 1 без обновления в таблице заказов. этот триггер запускается, только если all status = 1, где orders_foods.orders_id = orders.id
Ваша логика требует переосмысления, чтобы учесть ваш последний комментарий.






Попробуй это
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
; отсутствует в заявлении об обновлении. сейчас исправил. Проверь сейчас
Я пробовал это раньше и получил тот же # 1064 - У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MariaDB, чтобы найти правильный синтаксис рядом с '' в строке 7
У меня нет базы данных, поэтому я не мог проверить. Извините
СОЗДАТЬ ТАБЛИЦУ 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) ;
@gaj, возможно, вы захотите установить разделители
@ P.Salmon ха :) получил .. riskiwahyu надеюсь, теперь вы можете решить. Я исправил в своем ответе
этот триггер запускается. но это изменение статуса в orders = 1, когда изменяется только 1 статус orders_food.
Могу ли я сначала проверить этот триггер, например, выбрать статус в orders_food с тем же order_id, если status all select = 1, а затем активировать статус обновления для заказов до 1?
нет оператора выбора .. уже проверяется new.status = 1 (это только статус order_food). если вы говорите, что статус изменился с какого-то другого значения на 1, тогда должна обновляться только таблица заказов, а затем измените условие if на "IF (new.status = 1 and new.status <> old.status and old.order_id = new.order_id) ) ТОГДА"
возможно, как это НАЧАТЬ ЕСЛИ (new.status = 1 и new.status = old.status и new.order_id = order_id) ТОГДА обновлять заказы устанавливают статус = 1, где id = old.order_id; КОНЕЦ ЕСЛИ; КОНЕЦ
но у меня столбец не найден: 1054 Неизвестный столбец 'order_id' в 'списке полей' в C: \ xampp \ htdocs \ TUGASAKHIR \ admin \ Models \ Admin.php: 246
если status = 1, где new.order_id = order_id <все тот же order_id, тогда измените статус в order = 1
Если статус заказа не должен меняться до тех пор, пока все статусы 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
# 1146 - Таблица tugasakhir.debug_table не существует
хорошо, спасибо, я понял, братан, это НАЧАЛО объявить 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; конец, если; КОНЕЦ
с какой проблемой вы столкнулись сейчас?