尝试创建触发器时出现Mysql错误#1064

时间:2015-05-05 11:58:19

标签: mysql triggers

我正在尝试创建一个MySQL触发器,但不知道为什么会出现错误#1064。以下是完整的错误消息:

#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 'DECLARE popularity_cur CURSOR FOR select (sum(tbl_reviews.vote_value)/count(tbl_' at line 22

Line #22close cur;

这是我到目前为止所做的:

delimiter //
CREATE TRIGGER business_popularity_trigger_after_review_insert 
AFTER INSERT ON tbl_reviews FOR EACH ROW
BEGIN
DECLARE data_finished INTEGER DEFAULT 0;
DECLARE businessId, reviewId, dealId, businessServiceId INT DEFAULT 0; 
DECLARE businessPopularity INTEGER DEFAULT 0;
DECLARE popularity_finished INTEGER DEFAULT 0;

DECLARE cur CURSOR FOR select tbl_reviews.review_id, tbl_reviews.deal_id, deals.deal_id, deals.business_service_id, business_services.business_service_id, business_services.business_id from tbl_reviews INNER JOIN deals ON deals.deal_id = new.deal_id INNER JOIN business_services ON business_services.business_service_id = deals.business_service_id  
where tbl_reviews.review_id = new.review_id 
group by business_services.business_id;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET data_finished = 1;
OPEN cur;
    get_data: LOOP
        fetch cur into reviewId, dealId, businessServiceId, businessId;
        IF data_finished = 1 THEN 
            LEAVE get_data;
        END IF;
   END LOOP get_data;
close cur;
DECLARE popularity_cur CURSOR FOR select (sum(tbl_reviews.vote_value)/count(tbl_reviews.vote_value)) from tbl_reviews INNER JOIN business_services ON business_services.business_id = businessId INNER JOIN deals ON deals.business_service_id = business_services.business_service_id where deals.deal_is_deleted = 'N' and tbl_reviews.review_is_deleted = 'N' and tbl_reviews.review_status = 'Y';
set data_finished = 0;
IF businessId > 0 THEN
    OPEN popularity_cur;
        get_popularity: LOOP
            fetch popularity_cur into businessPopularity;
            IF data_finished = 1 THEN 
                LEAVE get_popularity;
            END IF;
       END LOOP get_popularity;
    close popularity_cur;
Update business 
set business.business_popularity = businessPopularity  
where business.business_id = businessId;
END IF;
delimiter;

请帮帮我。 感谢

1 个答案:

答案 0 :(得分:0)

您应该在末尾使用正确的分隔符//并关闭BEGIN ... END构造。所以将最后一行更改为:

END IF;
END//
DELIMITER;

更新由于您使用汇总函数SUMCOUNT,因此需要GROUP BY语句。所以试试这个:

DECLARE popularity_cur CURSOR FOR 
  SELECT (sum(tbl_reviews.vote_value)/count(tbl_reviews.vote_value)) 
  FROM tbl_reviews 
  INNER JOIN business_services 
  ON business_services.business_id = tbl_reviews.businessId 
  INNER JOIN deals 
  ON deals.business_service_id = business_services.business_service_id 
    AND deals.deal_is_deleted = 'N' 
  WHERE tbl_reviews.review_is_deleted = 'N' 
    AND tbl_reviews.review_status = 'Y'
  GROUP BY tbl_reviews.businessId;

我做了一些优化,你的条件错误business_services.business_id = businessId所以我确实改为business_services.business_id = tbl_reviews.businessId

注意可能不是错误,您需要business_services.business_id = businessId条件。但即使您需要,也应使用JOIN的一个条件和另一个条件进行过滤。所以它可能像:

INNER JOIN business_services 
  ON business_services.business_id = tbl_reviews.business_id
    AND business_services.business_id = businessId

更新2 根据您的数据库架构的屏幕截图,您的查询可能如下:

DECLARE popularity_cur CURSOR FOR 
  SELECT (sum(tbl_reviews.vote_value)/count(tbl_reviews.vote_value)) 
  FROM tbl_reviews 
  INNER JOIN deals 
  ON  tbl_reviews.deal_id = deals.deal_id 
    AND deals.deal_is_deleted = 'N' 
  INNER JOIN business_services 
  ON business_services.business_service_id  = deals.business_service_id 
  WHERE tbl_reviews.review_is_deleted = 'N' 
    AND tbl_reviews.review_status = 'Y'
  GROUP BY deals.business_service_id;