2016-11-29 17 views
-2

我有三個表(餐廳 - 票 - 評論)。我想創建一個觸發器,讓我更新餐館中的兩個字段(restaurant_rate_average,restaurant_comment_count)。這裏是我的觸發器:MariaDB - 更新後的複雜觸發查詢

DELIMITER $$ 

CREATE 
    TRIGGER `change comment status` AFTER UPDATE ON `comments` 
    FOR EACH ROW 
    BEGIN 

     UPDATE restaurants 
     INNER JOIN votes ON restaurants.restaurant_id = votes.vote_foreign_key 
     SET restaurants.restaurant_comment_count = SELECT (COUNT(votes.vote_id)) 
     WHERE votes.vote_model = 'restaurant' 
     AND WHERE old.comment_status<>NEW.comment_status; 

     UPDATE restaurants 
     INNER JOIN votes ON restaurants.restaurant_id = votes.vote_foreign_key 
     SET restaurants.restaurant_rate_average = SELECT (AVG(votes.vote_num)) 
     WHERE votes.vote_model = 'restaurant' 
     AND WHERE old.comment_status<>NEW.comment_status; 
    END; 
$$ 

DELIMITER ; 

其實我有一個錯誤:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'SELECT (COUNT(votes.vote_id)) 
     WHERE votes.vote_model = 'restaurant' 
     ' at line 8 

我試圖讓膚色更小,並用2替換SELECT(COUNT(votes.vote_id)),我得到新錯誤:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'WHERE comments.comment_status<>NEW.comment_status; 

     UPDATE resta' at line 9 

如何解決?

編輯:

這裏是我的僞表:

餐館: restaurant_id,restaurant_comment_count(INT),restaurant_rate_average(INT)

評論: COMMENT_ID,comment_status (布爾),comment_content(varchar),votes_vote_id(id)

票: vote_id,vote_foreign_key(ID),vote_model(VARCHAR)

EDITED 2:

我創造新的簡單的觸發器,它剛剛加入三個表和它的作品般的魅力:

BEGIN 
    UPDATE restaurants res 
    INNER JOIN votes v ON v.vote_foreign_key = res.restaurant_id AND v.vote_foreign_key = 'restaurant' 
    INNER JOIN comments cm ON cm.votes_vote_id = v.vote_id 
    SET res.restaurant_rate_average = 2 
    WHERE cm.comment_status = NEW.comment_status; 
END 

但是,如果我更換SET res.restaurant_rate_average = 2SELECT AVG(v.vote_id)我得到了一個錯誤。我也最後觸發編輯於:

我在第4行得到一個錯誤我想要的是取代靜態數量與SELECT AVG(votes.vote_num)

+1

請發表您的表 – e4c5

+0

你'WHERE'條款不有道理。它們指的是屬於「comments」表的'comment_status'列,但這個表不是連接的一部分。 –

+0

@ e4c5我更新了我的問題 – AFN

回答

-1
DROP TRIGGER IF EXISTS `update_comment_status`;CREATE DEFINER=`root`@`localhost` TRIGGER `update_comment_status` AFTER UPDATE ON `comments` FOR EACH ROW BEGIN 
    DECLARE RESTAURANT_RATE_AVERAGE INTEGER; 
    DECLARE RESTAURANT_COMMENT_COUNT INTEGER; 
    SET RESTAURANT_RATE_AVERAGE := (SELECT AVG(votes.vote_num) FROM votes); 
    UPDATE restaurants res 
    INNER JOIN votes v ON v.vote_foreign_key = res.restaurant_id AND v.vote_foreign_key = 'restaurant' 
    INNER JOIN comments cm ON cm.votes_vote_id = v.vote_id 
    SET restaurant_rate_average = RESTAURANT_RATE_AVERAGE 
    WHERE cm.comment_status = NEW.comment_status; 

    SET RESTAURANT_COMMENT_COUNT := (SELECT COUNT(votes.vote_id) FROM votes); 
     UPDATE restaurants res 
    INNER JOIN votes v ON v.vote_foreign_key = res.restaurant_id AND v.vote_foreign_key = 'restaurant' 
    INNER JOIN comments cm ON cm.votes_vote_id = v.vote_id 
    SET restaurant_comment_count = RESTAURANT_COMMENT_COUNT 
    WHERE cm.comment_status = NEW.comment_status; 

END 
+0

AVG和COUNT都在_all_餐廳。這似乎是'錯誤'。 –