2015-11-19 2 views
0

Я хочу реализовать систему просмотра для своего сайта. Вот структура моих таблиц:вставка, если есть обновление с помощью триггера

// table1 
id | user_or_ip | post_id | date_time // inserting new row for each viewed 

// table2 
id | post_id | total_viewed    // getting the number of total viewed for each post 

Теперь мне нужно триггер для вставки/обновления table2 после вставки в table1.

I думаю, что я должен использовать on duplicate key.

ответ

1

Вы можете сделать это довольно легко.

Со следующим 2 примера таблицы: -

CREATE TABLE table1 
(
    id INT NOT NULL AUTO_INCREMENT, 
    user_or_ip VARCHAR(255), 
    post_id INT, 
    date_time DATETIME, 
    PRIMARY KEY (id) 
); 

CREATE TABLE table2 
(
    id INT NOT NULL AUTO_INCREMENT, 
    post_id INT, 
    total_viewed INT, 
    PRIMARY KEY (id), 
    UNIQUE KEY post_id (post_id) 
); 

вы можете использовать следующий триггер на таблицу 1, чтобы вычислить количество и вставить его в таблице 2: -

CREATE TRIGGER `trig_1` AFTER INSERT ON `table1` 
FOR EACH ROW BEGIN 
INSERT INTO table2(post_id, total_viewed) 
SELECT post_id, COUNT(*) 
FROM table1 
WHERE post_id = NEW.post_id 
GROUP BY post_id 
ON DUPLICATE KEY UPDATE total_viewed = VALUES(total_viewed); 
END 

Заметим, что если вы уверены, что никогда не будет ошибки, вы можете просто вставить счетчик 1 и установить его в total_count + 1 в разделе ON DUPLICATE KEY. Но если что-то не удается, что предотвращает курок отсчеты будет вечно неправильно для этого POST_ID: -

CREATE TRIGGER `trig_1` AFTER INSERT ON `table1` 
FOR EACH ROW BEGIN 
INSERT INTO table2(post_id, total_viewed) 
VALUES(NEW.post_id, 1) 
ON DUPLICATE KEY UPDATE total_viewed = total_viewed + 1; 
END 

Заметим также, что суб-запрос, чтобы получить количество будет более эффективным с индексом на POST_ID в table1

+0

Спасибо, +1. Но у меня есть 2 вопроса: 1. Почему вы использовали 'group by'? (user_or_ip, post_id) уникальны. 2. почему он должен вычислять общее количество просмотров после каждого нового просмотра? (как вы сказали), пожалуйста, покажите мне, как это может выглядеть всего ++ после каждого нового просмотра ... – stack

+0

Я использовал GROUP BY, поскольку возвращаю post_id в SELECT, и я предпочитаю придерживаться стандартов SQL в отношении имеющих все неагрегатные поля, перечисленные в предложении GROUP BY. – Kickstart

+0

Хорошо, только одно. Я хочу создать уникальную группу для ('user_or_ip',' post_id') в таблице1. на самом деле я хочу предотвратить увеличение количества просмотренных в несколько раз на одного человека. что я хочу сделать правильно? – stack

Смежные вопросы