Има една концепция при базите-данни, която е слабо позната от PHP/MySQL програмистите, за съжаление. Не само една, но за конкретния случай - тригери.
Какво е тригер? Когато добавиш нов запис в дадена таблица (или пък обновищ съществуваш запис), сървъра за бази данни (mysql), може да изпълни някакво действие автоматично, като например да изчисли и запише някаква стойност в същата таблица или пък да изпълни заявка към друга таблица.
В твоя случай, ти искаш като добавиш точките на потребителя за днес, автоматично да се обновява общия сбор от точки за този потребител от всички дни, но в отделна таблица. Обикновенно РНР програмистите го правят с РНР. Причината поради която се правеше с РНР, беше че доста време MySQL не поддъжаше тази функционалност, която е стандартна за подобни на него сървъри. След вeрсия 5.0 вече има и тригери.
Ето един пример, обаче не съм много сигурен дали се поддържа на всеки shared hosting!
Двете таблици
- score_daily - записваш точките на потребителите всеки ден
- score_total - общия сбор точки за всеки потребител
[sql]
CREATE TABLE `score_daily` (
`user_id` int(10) NOT NULL,
`score` int(5) NOT NULL,
`sdate` date NOT NULL
) ENGINE=InnoDB;
CREATE TABLE `score_total` (
`user_id` int(10) NOT NULL,
`total` int(10) NOT NULL,
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB;
[/sql]
И сега тригера:
[sql]
delimiter #
create trigger update_total after insert on score_daily
for each row
begin
insert into score_total (user_id, total) values (new.user_id, new.score) on duplicate key update total = total + new.score;
end#
delimiter ;
[/sql]
Какво означава този код? Тригера ще се изпълнява след всеки INSERT в таблицата score_daily. Когато се случи такова събитие, ще се изпълнява заявка, която ще добавя нов ред в таблицата score_total (това в случай, че става въпрос за нов потребител, за който до момента няма данни в тази таблица) ИЛИ, ако има вече такъв потребител в тази таблица, ще обновва колоната total, като добавя новия брой точки.
[sql]
mysql> select * from score_daily;
Empty set (0.00 sec)
mysql> select * from score_total;
Empty set (0.00 sec)
mysql> insert into score_daily values (1, 10, '2013-07-10');
mysql> insert into score_daily values (1, 5, '2013-07-12');
mysql> select * from score_daily;
+---------+-------+------------+
| user_id | score | sdate |
+---------+-------+------------+
| 1 | 10 | 2013-07-10 |
| 1 | 5 | 2013-07-12 |
+---------+-------+------------+
2 rows in set (0.00 sec)
mysql> select * from score_total;
+---------+-------+
| user_id | total |
+---------+-------+
| 1 | 15 |
+---------+-------+
[/sql]