Вы можете сделать это довольно легко.
Со следующим 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
Спасибо, +1. Но у меня есть 2 вопроса: 1. Почему вы использовали 'group by'? (user_or_ip, post_id) уникальны. 2. почему он должен вычислять общее количество просмотров после каждого нового просмотра? (как вы сказали), пожалуйста, покажите мне, как это может выглядеть всего ++ после каждого нового просмотра ... – stack
Я использовал GROUP BY, поскольку возвращаю post_id в SELECT, и я предпочитаю придерживаться стандартов SQL в отношении имеющих все неагрегатные поля, перечисленные в предложении GROUP BY. – Kickstart
Хорошо, только одно. Я хочу создать уникальную группу для ('user_or_ip',' post_id') в таблице1. на самом деле я хочу предотвратить увеличение количества просмотренных в несколько раз на одного человека. что я хочу сделать правильно? – stack