我正在尝试创建一个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 #22
是close 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;
请帮帮我。 感谢
答案 0 :(得分:0)
您应该在末尾使用正确的分隔符//
并关闭BEGIN ... END
构造。所以将最后一行更改为:
END IF;
END//
DELIMITER;
更新由于您使用汇总函数SUM
,COUNT
,因此需要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;