Задавайте вопросы, мы ответим
Вы не зашли.
Добрый день, начинаю свой путь в MySQL. Использую Workbench.
Есть 3 таблицы:
таблица1 поля:id_bus, пробег, готовность.
таблица2 поля: Тип ТО, пробег(на момент то, например 95000), Код ТО(внешний ключ 3-й таблицы), id_bus
таблица3 поля : Код ТО, периодичность (например 10000).
Что я хочу:
При обновлении строки таблицы1 проверять :
Нужно взять сумму 2-х полей из 2-х других таблиц и сравнить со значением в обновляемой строке,
в зависимости от результата, полю "Готовность" обновляемой строки присвоить либо 1 либо 0
Триггер хочу поставить после обновления таблицы1:
DROP TRIGGER IF EXISTS `mydbftest`.`buses_BEFORE_UPDATE`;
DELIMITER $$
USE `mydbftest`$$
CREATE DEFINER = CURRENT_USER TRIGGER `mydbftest`.`buses_BEFORE_UPDATE` BEFORE UPDATE ON `buses` FOR EACH ROW
BEGIN
declare sumP int;
sumP = ((select историято.пробег from историято where историято.id_bus = NEW.id_bus)+
(select категориито.периодичность from категориито.Код ТО =(select историято.Код ТО from историято
where историято.id_bus = NEW.id_bus)))
if sumP >NEW.пробег then NEW.готовность = 1
else NEW.готовность = 0;
end if
END$$
DELIMITER ;
На это получаю ошибку - проверьте синтаксис. "ERROR 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '= ((select историято.пробег from историято where истÐ' at line 4"
версия mysql 8,0,28
Собственно вопрос: Что я делаю не так? где можно прочитать/посмотреть как делать правильно ?
P.S. Ссаными тряпками прошу не кидать, триггер первый в жизни, с sql работал очень давно.
Отредактированно Dmitrii (23.01.2022 17:32:40)
Неактивен
1. Нужно использовать SET для присвоения
SET sumP = ..
SET NEW.готовность = 1
SET NEW.готовность = 0
2. Что означает конструкция "from категориито.Код ТО"
Подозреваю, что речь о " from категориито where `Код ТО`"
Имена полей, состоящие из нескольких слов, нужно брать в обратные кавычки.
3. Пропущено несколько ;
Рабочий вариант https://dbfiddle.uk/?rdbms=mysql_8.0&am … 9fabc9809f
Неактивен
"2. Что означает конструкция "from категориито.Код ТО"
Подозреваю, что речь о " from категориито where `Код ТО`""
Да, именно так, копировал 2 раза, потерял часть кода.
Большое спасибо за помощь и за очень полезную ссылку !
Неактивен
Здравствуйте
Возник вопрос, а как можно сравнить несколько значений между собой ?
например в таблице1 нужное поле currenmileage = 50000
в результате запроса
select TOHistory.Mileage + TechnicalOperations.ChangeInterval as SUM, TOHistory.TechnicalOperationsID as ID from TOHistory
JOIN
TechnicalOperations ON TechnicalOperations.id_Operation = TOHistory.TechnicalOperationsID
where TOHistory.idBuses = NEW.idBuses
я получаю
SUM IDTO
20000 1
50000 2
90000 3
мне нужно сравнить currenmileg c каждой строкой результата, причем их может быть 1 или 2 или 3
и в зависимости от результата сделать действие.
Уточню, мне нужно обработать результат сравнения с каждой строкой отдельно, и учесть что её может и не быть.
Например currenmileage > SUM для IDTO = 2.
Есть в SQL конструкции типа циклов foreach ? или что то вроде while( not eof )?
Отредактированно Dmitrii (24.01.2022 17:20:31)
Неактивен
Нашёл такое решение :
select SUM from
(select TOHistory.Mileage + TechnicalOperations.ChangeInterval as SUM, TOHistory.TechnicalOperationsID as ID from TOHistory
JOIN
TechnicalOperations ON TechnicalOperations.id_Operation = TOHistory.TechnicalOperationsID
where TOHistory.idBuses =1 ) as SM where ID =1;
{Обработка результата}
select SUM from
(select TOHistory.Mileage + TechnicalOperations.ChangeInterval as SUM, TOHistory.TechnicalOperationsID as ID from TOHistory
JOIN
TechnicalOperations ON TechnicalOperations.id_Operation = TOHistory.TechnicalOperationsID
where TOHistory.idBuses =1 ) as SM where ID =2;
{Обработка результата}
select SUM from
(select TOHistory.Mileage + TechnicalOperations.ChangeInterval as SUM, TOHistory.TechnicalOperationsID as ID from TOHistory
JOIN
TechnicalOperations ON TechnicalOperations.id_Operation = TOHistory.TechnicalOperationsID
where TOHistory.idBuses =1 ) as SM where ID =3;
{Обработка результата}
Вопрос - нет чего либо более оптимального ? Не будет проблем с быстродействием ?
Неактивен
Решение плохое, вы трижды выполняете один и тот же запрос.
Обычно результат запроса обрабатывается в яп, на котором вы пишите, и с каждой полученной строкой выполняются нужные действия.
Можно и на mysql написать хранимую процедуру, в них есть циклы, см https://dev.mysql.com/doc/refman/8.0/en … ments.html
Неактивен
Да я по этому и спрашиваю про более оптимальное решение. Во внешнем то проблем нет, нужно именно внутри БД.
Циклы в SQL предполагают только вызов запросов в цикле, что мне не подходит.
по этому добавил условие проверки и лимит на 1 запись. Подробности буду проверять во внешней программе, по вашему совету.
Благодарю за подсказки.
Неактивен