[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: case when then в update
Invis1ble
Имеется MySQL. Пытаюсь сделать триггер, обновляющий денормализованную таблицу после события вставки. Есть затык в синтаксисе, нужна подсказка.
DROP TRIGGER IF EXISTS `update_site_opinions_stats`;
DELIMITER |
CREATE TRIGGER `update_site_opinions_stats` AFTER INSERT ON `opinions`
FOR EACH ROW BEGIN
UPDATE `sites` AS `s`
SET
`s`.`opinions_count` = `s`.`opinions_count` + 1,
`s`.`rating` = `s`.`rating` + CAST(NEW.`mark` AS SIGNED INT),
CASE NEW.`mark`
WHEN '-1' THEN `s`.`neg_opinions_count` = `s`.`neg_opinions_count` + 1;
WHEN '1' THEN `s`.`pos_opinions_count` = `s`.`pos_opinions_count` + 1;
WHEN '1' THEN `s`.`pos_opinions_count` = `s`.`pos_opinions_count` + 1;
WHERE `sites`.`id` = NEW.`site_id`;
END |

Проблема с блоком CASE, синтаксическая ошибка. Думаю из кода задумка понятна, подскажите как подправить синтаксис.



Спустя 6 минут, 53 секунды (11.09.2012 - 07:57) TranceIT написал(а):

CASE NEW.`mark`
WHEN '-1' THEN `neg_opinions_count` = `neg_opinions_count` + 1;
WHEN '1' THEN `pos_opinions_count` = `pos_opinions_count` + 1;
WHEN '1' THEN `pos_opinions_count` = `pos_opinions_count` + 1;
END

Спустя 5 минут, 52 секунды (11.09.2012 - 08:02) Invis1ble написал(а):
TranceIT
не помогает, вот запрос (немного подправил, т.к. в первом посте скопипастил с ошибками)
DROP TRIGGER IF EXISTS `update_site_opinions_stats`;
DELIMITER |
CREATE TRIGGER `update_site_opinions_stats` AFTER INSERT ON `opinions`
FOR EACH ROW BEGIN
UPDATE `sites` AS `s`
SET
`s`.`opinions_count` = `s`.`opinions_count` + 1,
`s`.`rating` = `s`.`rating` + CAST(NEW.`mark` AS SIGNED INT),
CASE NEW.`mark`
WHEN '-1' THEN `s`.`neg_opinions_count` = `s`.`neg_opinions_count` + 1;
WHEN '1' THEN `s`.`pos_opinions_count` = `s`.`pos_opinions_count` + 1;
WHEN '0' THEN `s`.`neu_opinions_count` = `s`.`neu_opinions_count` + 1;
END
WHERE `s`.`id` = NEW.`site_id`;
END |

Цитата
#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 'CASE NEW.`mark`
            WHEN '-1' THEN `s`.`neg_opinions_count` = `s`.`neg_o' at line 7

Спустя 7 минут, 41 секунда (11.09.2012 - 08:10) Invis1ble написал(а):
Сделал пока что через IF(), но коряво немного, с CASE мне вариант больше по душе :)
DROP TRIGGER IF EXISTS `update_site_opinions_stats`;
DELIMITER |
CREATE TRIGGER `update_site_opinions_stats` AFTER INSERT ON `opinions`
FOR EACH ROW BEGIN
UPDATE `sites` AS `s`
SET
`s`.`opinions_count` = `s`.`opinions_count` + 1,
`s`.`rating` = `s`.`rating` + CAST(NEW.`mark` AS SIGNED INT),
`s`.`neg_opinions_count` = IF(NEW.`mark` = '-1', `s`.`neg_opinions_count` + 1, `s`.`neg_opinions_count`),
`s`.`pos_opinions_count` = IF(NEW.`mark` = '1', `s`.`pos_opinions_count` + 1, `s`.`pos_opinions_count`),
`s`.`neu_opinions_count` = IF(NEW.`mark` = '0', `s`.`neu_opinions_count` + 1, `s`.`neu_opinions_count`)
WHERE `s`.`id` = NEW.`site_id`;
END |

Спустя 56 минут, 30 секунд (11.09.2012 - 09:07) Oyeme написал(а):
Попробуйте так вот.

DROP TRIGGER IF EXISTS `update_site_opinions_stats`;
DELIMITER |
CREATE TRIGGER `update_site_opinions_stats` AFTER INSERT ON `opinions`
FOR EACH ROW BEGIN
UPDATE `sites` AS `s`
SET
`s`.`opinions_count` = `s`.`opinions_count` + 1,
`s`.`rating` = `s`.`rating` + CAST(NEW.`mark` AS SIGNED INT),
s.mark = (
CASE NEW.`mark`
WHEN '-1' THEN `s`.`neg_opinions_count` = `s`.`neg_opinions_count` + 1
WHEN '1' THEN `s`.`pos_opinions_count` = `s`.`pos_opinions_count` + 1
WHEN '0' THEN `s`.`neu_opinions_count` = `s`.`neu_opinions_count` + 1
END
)
WHERE `s`.`id` = NEW.`site_id`;
END |

Спустя 5 минут, 1 секунда (11.09.2012 - 09:12) Invis1ble написал(а):
s.mark - такого поля нет =) есть `opinions`.`mark` и в зависимости от его значения мне нужно обновить определенное поле в `sites`

Спустя 2 часа, 52 минуты, 28 секунд (11.09.2012 - 12:04) Oyeme написал(а):
Заметил,case Вам не подходит и он не будет работать.
Ваш вариант правильный в этом случаи.

У Вас обновляются 3 разных поля. wink.gif

Другой вариант:
Вы можете в триггере на уровне переменных сделать switch и потом подставлять уже как переименую за места поля.

Спустя 7 часов, 13 минут, 54 секунды (11.09.2012 - 19:18) Invis1ble написал(а):
Oyeme
Цитата
Другой вариант:
Вы можете в триггере на уровне переменных сделать switch и потом подставлять уже как переименую за места поля.

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


_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.