Таблици - връзки. Как?

youngmen

Registered
Здравейте,
имам таблици за всеки потребител и стойности, които се въвеждат за всеки ден. Искам във друга обобщаваща таблица да има всички потребители и за всеки потребител общата стойност от всички стойности до сега. За да ви е по- ясно, прикачвам картинка.
6389869n.png

Искам когато въвеждам стойност за всеки ден, да се актуализират общите точки на отделния потребител в общата таблица. И когато има нов потребител съответно и нова таблица, новия потребител да се появява и в общата таблица. Мислих го ама нищо не измислих. Моля помогнете :)
Благодаря![/url]
 
Има една концепция при базите-данни, която е слабо позната от 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]
 

Back
Горе