Оператор SELECT CASE в TRIGGER

У меня есть запрос с оператором «SELECT CASE», который работает нормально:

SELECT 
(CASE `t`.`is_combined` 
WHEN 0 
THEN `t`.`topic_id` 
ELSE `t`.`is_combined` 
END) AS`group_id`,
    SUM(`ctt`.`tm_download_status`) AS `is_downloaded`, 
    COUNT(`t`.`topic_id`) AS `group_topics_cnt`,
    (SUM(`ctt`.`tm_download_status`) = COUNT(`t`.`topic_id`)) AS `is_downloaded_group` 
    FROM (`catalog_topics` `t` LEFT JOIN `catalog_tracker_torrents` `ctt` ON((`ctt`.`topic_id` = `t`.`topic_id`))) 
    WHERE (`t`.`topic_id` != 0) 
    GROUP BY (`group_id`)

Итак, я хочу создать аналогичный триггер для обновления «перекрестной» таблицы:

DELIMITER $$ 
CREATE TRIGGER `tdg_ins_by_topics` AFTER INSERT ON `catalog_topics` FOR EACH ROW 
BEGIN
REPLACE INTO catalog_topics_downloaded_groups(
      SELECT (
              CASE `t`.`is_combined`
              WHEN 0
              THEN `t`.`topic_id`
              ELSE `t`.`is_combined`
              END
     ) AS `group_id` , 
SUM( `ctt`.`tm_download_status` ) AS `is_downloaded` , 
COUNT( `t`.`topic_id` ) AS `group_topics_cnt` , (
SUM( `ctt`.`tm_download_status` ) = COUNT( `t`.`topic_id` ) ) AS `is_downloaded_group`
FROM `catalog_topics` `t`
LEFT JOIN `catalog_tracker_torrents` `ctt` ON `ctt`.`topic_id` = `t`.`topic_id`
WHERE `t`.`topic_id`
IN (
NEW.`topic_id`
)
GROUP BY `group_id`
)
END ;
$$

Но получаю сообщение об ошибке:

"#"1064 - у вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с «END» в строке 14.

Похоже, что MySQL не понимает разницы между CASE в операторе TRIGGER и CASE в операторе SELECT. Итак, как я могу это исправить?

Спасибо за ответы.


person arkhamvm    schedule 27.04.2012    source источник
comment
я исправил грамматическую ошибку. Насчет 14 строки - это был первый END, я забыл, что phpMyAdmin отправляет запросы после табуляции и переноса строк. Мне стыдно.   -  person arkhamvm    schedule 27.04.2012


Ответы (1)


Я думаю, вам нужно «заканчивать» оператор REPLACE ;, как вы должны заканчивать все операторы внутри TRIGGER или PROCEDURE/FUNCTION разделителем.

Вот почему вы меняете DELIMETER на $$ .. чтобы вы могли использовать ; для хранения разделителя mysql по умолчанию внутри кода триггера. (и завершите оператор создания триггера измененным разделителем $$)

DELIMITER $$ 
CREATE TRIGGER `tdg_ins_by_topics` AFTER INSERT ON `catalog_topics` FOR EACH ROW 
BEGIN
    REPLACE INTO catalog_topics_downloaded_groups(
          SELECT ( CASE `t`.`is_combined`
                   WHEN 0
                   THEN `t`.`topic_id`
                   ELSE `t`.`is_combined`
                   END
                 ) AS `group_id`, 
                 SUM(`ctt`.`tm_download_status`) AS `is_downloaded`, 
                 COUNT( `t`.`topic_id` ) AS `group_topics_cnt` , 
                 (
                 SUM( `ctt`.`tm_download_status` ) = COUNT( `t`.`topic_id` ) ) AS `is_downloaded_group`
          FROM `catalog_topics` `t`
          LEFT JOIN `catalog_tracker_torrents` `ctt` ON `ctt`.`topic_id` = `t`.`topic_id`
          WHERE `t`.`topic_id` IN ( NEW.`topic_id` )
          GROUP BY `group_id`
    );
END;
$$
DELIMETER ;
person Kaii    schedule 27.04.2012