2017-02-07 125 views
1

我有2个MySQL表, 一个将与需要汇总(表1)新行进行更新。 ,以及一个应该使用mysql触发器自动填充聚合数据的表(表2)。MySQL的触发器为聚集一个表的行到另一个表

鉴于表的模式:

实施例用于表1: 表要被汇集 enter image description here

UNIQUE KEY uniqueiduniqueidciaistatus

实施例用于表2: 的汇总表 enter image description here

UNIQUE KEY IX_Unique_dailyaiciday

的SQL触发器应该是这样的:

DELIMITER $$

CREATE TRIGGER yii_botclient2st_unqiue_trigger AFTER INSERT ON yii_botclient2st_unique FOR EACH ROW BEGIN

SET @myDay := DATE(NEW.date); 
SET @today = DATE(); 
SET isDaily := SELECT COUNT(id) FROM `yii_botclient2`.`st_daily` WHERE `ai` = NEW.ai AND st_daily.ci = NEW.ci AND st_daily.day = @myDay; 
SET myDaily = IFNULL(isDaily, 'No'); 

IF (myDaily = 'No') THEN 
    IF NEW.status = 0 
     INSERT INTO st_daily (`day`, `ai`,`ci`,`impressions`,`updated`) VALUES (@today,NEW.ai,NEW.ci,1,NOW()); 
    ELSEIF NEW.status = 1 
     INSERT INTO st_daily (`day`, `ai`,`ci`,`clicks`,`updated`) VALUES (@today,NEW.ai,NEW.ci,1,NOW()); 
    ELSEIF NEW.status = 2 
     INSERT INTO st_daily (`day`, `ai`,`ci`,`leads`,`updated`) VALUES (@today,NEW.ai,NEW.ci,1,NOW()); 
    ELSEIF NEW.status = 3 
     INSERT INTO st_daily (`day`, `ai`,`ci`,`ftds`,`updated`) VALUES (@today,NEW.ai,NEW.ci,1,NOW()); 
    END IF; 
ELSE 
    IF NEW.status = 0 
     UPDATE st_daily SET `impressions` = `impressions` + 1 WHERE st_daily.ci = NEW.ci AND st_daily.ai = NEW.ai AND st_daily.day = @myDay; 
    ELSEIF NEW.status = 1 
     UPDATE st_daily SET `clicks` = `clicks` + 1 WHERE st_daily.ci = NEW.ci AND st_daily.ai = NEW.ai AND st_daily.day = @myDay; 
    ELSEIF NEW.status = 2 
     UPDATE st_daily SET `leads` = `leads` + 1 WHERE st_daily.ci = NEW.ci AND st_daily.ai = NEW.ai AND st_daily.day = @myDay; 
    ELSEIF NEW.status = 3 
     UPDATE st_daily SET `ftds` = `ftds` + 1 WHERE st_daily.ci = NEW.ci AND st_daily.ai = NEW.ai AND st_daily.day = @myDay; 
    END IF; 
END IF; 

END$$ 

DELIMITER;

你能帮忙用MySQL触发器吗?

+0

您有什么问题? –

+0

我无法执行触发器查询,我不明白它有什么问题 –

回答

0

声明你的变量,在set语句中使用=,Date函数需要一个参数,if语句需要的话 像这样的东西编译到它抱怨表不存在的地方,如果你想要任何进一步的帮助,请提供表在问题中作为文本或SQL小提琴。

drop trigger if exists st_unqiue_trigger; 

DELIMITER $$ 

CREATE TRIGGER yii_botclient2.st_unqiue_trigger AFTER INSERT ON st_unique FOR EACH ROW BEGIN 
declare myday date; 
declare today date; 
declare isdaily int; 
declare mydaily varchar(2); 
SET myDay = DATE(NEW.date); 
SET today = date(now()); 
SELECT COUNT(id) into isdaily FROM `yii_botclient2`.`st_daily` WHERE `ai` = NEW.ai AND st_daily.ci = NEW.ci AND st_daily.day = myDay; 
SET myDaily = IFNULL(isDaily, 'No'); 

IF (myDaily = 'No') THEN 
    IF NEW.status = 0 then 
     INSERT INTO st_daily (`day`, `ai`,`ci`,`impressions`,`updated`) VALUES (today,NEW.ai,NEW.ci,1,NOW()); 
    ELSEIF NEW.status = 1 then 
     INSERT INTO st_daily (`day`, `ai`,`ci`,`clicks`,`updated`) VALUES (today,NEW.ai,NEW.ci,1,NOW()); 
    ELSEIF NEW.status = 2 then 
     INSERT INTO st_daily (`day`, `ai`,`ci`,`leads`,`updated`) VALUES (today,NEW.ai,NEW.ci,1,NOW()); 
    ELSEIF NEW.status = 3 then 
     INSERT INTO st_daily (`day`, `ai`,`ci`,`ftds`,`updated`) VALUES (today,NEW.ai,NEW.ci,1,NOW()); 
    END IF; 
ELSE 
    IF NEW.status = 0 then 
     UPDATE st_daily SET `impressions` = `impressions` + 1 WHERE st_daily.ci = NEW.ci AND st_daily.ai = NEW.ai AND st_daily.day = myDay; 
    ELSEIF NEW.status = 1 then 
     UPDATE st_daily SET `clicks` = `clicks` + 1 WHERE st_daily.ci = NEW.ci AND st_daily.ai = NEW.ai AND st_daily.day = myDay; 
    ELSEIF NEW.status = 2 then 
     UPDATE st_daily SET `leads` = `leads` + 1 WHERE st_daily.ci = NEW.ci AND st_daily.ai = NEW.ai AND st_daily.day = myDay; 
    ELSEIF NEW.status = 3 then 
     UPDATE st_daily SET `ftds` = `ftds` + 1 WHERE st_daily.ci = NEW.ci AND st_daily.ai = NEW.ai AND st_daily.day = myDay; 
    END IF; 
END IF; 

END $$ 

delimiter ; 
相关问题