[ peromalosutra @ 23.12.2011. 19:36 ] @
Pozdrav svima.

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; $$


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? :)
[ peromalosutra @ 23.12.2011. 19:54 ] @
Da odgovorim sam sebi :D

Code:

CREATE TRIGGER `monthlyUpdate` BEFORE UPDATE ON `community_users` 
FOR EACH ROW BEGIN 
INSERT INTO `monthly_points` (`user_id`,`year`,`month`,`points`)
VALUES (OLD.`userid`,YEAR(NOW()), MONTH(NOW()),0)
ON DUPLICATE KEY UPDATE
    `user_id` = OLD.`userid`, 
    `year` = YEAR(NOW()),
    `month` = MONTH(NOW()),
    `points` = `points` + NEW.`points` - OLD.`points`; 
END;


Problem je sto REPLACE INTO radi to sto joj i ime kaze, tj. zamjeni vrijednost, pa stara bude nedostpuna. :)
[ djoka_l @ 23.12.2011. 19:56 ] @
Nisam strucan za MySql, ali mi liči da je u naredbi
Code:

`points` = `points` + NEW.`points` - OLD.`points`; END; $$


ono desno `points` nedefinisano.

Ne znam kako bi MySql znao na koji se red u tabeli monthlyUpdate odnosi ovo, ali opet napominjem da mi nije MySql nije specijalnost. Ne znam ni kako radi Replace komanda...
[ peromalosutra @ 23.12.2011. 20:08 ] @
Da, to je to. S tim da mi u ovom update ni ne treba da diram vrijednosti iz kljuca, prepravljao sam postojeci kod pa je to ostalo. Dovoljno je samo:

Code:

CREATE TRIGGER `monthlyUpdate` BEFORE UPDATE ON `community_users` 
FOR EACH ROW BEGIN 
INSERT INTO `monthly_points` (`user_id`,`year`,`month`,`points`)
VALUES (OLD.`userid`,YEAR(NOW()), MONTH(NOW()),0)
ON DUPLICATE KEY UPDATE
    `points` = `points` + NEW.`points` - OLD.`points`; 
END;