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 разных поля.
Другой вариант:
Вы можете в триггере на уровне переменных сделать switch и потом подставлять уже как переименую за места поля.
Ваш вариант правильный в этом случаи.
У Вас обновляются 3 разных поля.

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