2017-02-07 1 views
1

У меня есть 2 таблицы MySQL, , которые будут обновлены новыми строками, которые необходимо агрегировать (ТАБЛИЦА 1). и тот, который должен быть автоматически заполнен агрегированными данными с помощью триггера mysql (ТАБЛИЦА 2).MySQL Trigger для объединения строк одной таблицы в другую таблицу

Учитывая таблицы схемы:

Пример ТАБЛИЦА 1: Таблица агрегатироваться enter image description here

уникальный ключ uniqueid (uniqueid, ci, ai, status)

Пример Таблица 2: Совокупный стол enter image description here

UNIQUE KEY IX_Unique_daily (ai, ci, day)

SQL-триггера должно быть что-то вроде:

DELIMITER $$

CREATE TRIGGER yii_botclient2. st_unqiue_trigger ПОСЛЕ ВСТАВКИ ON yii_botclient2. st_unique ДЛЯ КАЖДОЙ ROW НАЧАТЬ

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 Trigger?

+0

Какая у вас проблема? –

+0

Я не могу выполнить запрос триггера, и я не понимаю, что с ним не так. –

ответ

0

Объявите свои переменные, используйте = в операторах набора, функции Date должны иметь параметр, если операторы нужны тогда Что-то вроде этого компилируется до такой степени, что он жалуется на не существующие таблицы. Если вы хотите получить дополнительную помощь, пожалуйста, предоставьте таблицы в вопросе как текст или скрипт 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 ; 
Смежные вопросы