Imam jedan problemcic, pa ako moze jos jedan par ociju da pogleda jer je sigurno neka ocigledna greska.
Imam tabelu community_users koja ima polje 'points'. Ovo polje cuva ukupan broj poena koje korisnik posjeduje, inace radi se o jednom socijalnom sajtu. Sada treba da zbog nekih statistika izvucem broj poena koje je korisnik ostvario na mjesecnom nivou.
Napravio sam novu tabelu: monthly_points koja ima polja (userid, year, month, points). Kljuc cine userid, year, month. Sad da ne bih morao prepravljati kod koji radi ovaj update jer bi to stvorilo probleme sa kasnijim updejtovanjem, napravio sam trigger:
Code:
CREATE TRIGGER `monthlyUpdate` BEFORE UPDATE ON `community_users`
FOR EACH ROW BEGIN
REPLACE INTO `monthly_points`
SET `user_id` = OLD.`userid`,
`year` = YEAR(NOW()),
`month` = MONTH(NOW()),
`points` = `points` + NEW.`points` - OLD.`points`; END; $$
CREATE TRIGGER `monthlyUpdate` BEFORE UPDATE ON `community_users`
FOR EACH ROW BEGIN
REPLACE INTO `monthly_points`
SET `user_id` = OLD.`userid`,
`year` = YEAR(NOW()),
`month` = MONTH(NOW()),
`points` = `points` + NEW.`points` - OLD.`points`; END; $$
Triger je jednostavan, radi u dva koraka:
1. Nalazi se razlika NEW.points - OLD.points za tabelu community_users, sto predstavlja broj poena koje je korisnik dobio (ili koji se oduzimaju, jer moze biti i negativan).
2. Zatim se ovaj broj dodaje na trenutno stanje `points` polja u monthly_points tabeli.
Triger je dodan u bazu i izvrsava se uredno, medjutim kada updejtujem vrijednosti u community_users tabeli, umjesto da se ta razlika izracunata pod 1) doda na polje monthly_points.points, ono sto se desava je da se u to polje snimi ta razlika.
Na primjer, ukoliko je korisnik imao 8000 poena i dobije jos 50, njegovo ukupno stanje je 8050. Ukoliko je u tom mjesecu do tada ostvario 100 poena, novo stanje bi trebalo da bude 150. Medjutim, umjesto toga, meni se to stanje ponovo snimi u tabelu, pa dobijem da je taj mjesec osvojio 50 poena.
Ocigledno je problem oko "`points` = `points` + NEW.`points` - OLD.`points`" ali ne vidim zasto. Moze pomoc? :)