http://phpfi.com/105828?lang=sql
ogólny skrót: mamy tabele:
arts_users (id_user)
arts_articles (id_article, points, id_user, publish(0,1) )
arts_bonus (id_user, points)
arts_access (id_user, id_article)
teraz wyciągamy dla wszystkich userów:
liczbe punktów normalnych (z arts_articles gdzie id_user=aktualny user i publish=1)
liczbe bonusowych punktów (z arts_bonus gdzie id_user=aktualny user)
liczbe ujemnych punktow (z arts_access i arts_articles)
zasada działania:
wiec tak: userzy dostaja punkty za opublikowane punkty - te punkty sa liczone jako 'normalne' punkty
admin może im dodawać 'bonusowe' punkty
a punkty ujemne - jeżeli user przejrzy jakiś artykul to do arts_access dopisuje się prawo do przegladania, tymsamym odemowane będzie miał tyle punktów za ile jest ten artykuł
jeżeli ktoś chce zobaczyć całość w oprawie to: TUTAJ zalogować się na admin/admin ew.do dalszych testów na user/user
tutaj zapytanie BEZ sumowania punktów ujemnych:
SELECT login, u.id_user, IF(COUNT(DISTINCT b.id)>0, SUM(a.points)/COUNT(DISTINCT b.id), SUM(a.points)) AS punkty, IF(COUNT(DISTINCT a.id_article)>0, SUM(b.points)/COUNT(DISTINCT a.id_article), SUM(b.points)) AS bonus FROM arts_users u LEFT OUTER JOIN arts_bonus b ON u.id_user=b.id_user LEFT OUTER JOIN arts_articles a ON (u.id_user=a.id_user AND a.publish=1) GROUP BY u.id_user ORDER BY u.id_user ASC
zrzut tabeli w skrócie:
CREATE TABLE bonus ( id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, points TINYINT UNSIGNED NULL, id_user INTEGER UNSIGNED NULL, PRIMARY KEY(id) ); CREATE TABLE articles ( id_article INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, points TINYINT UNSIGNED NULL, publish TINYINT UNSIGNED NULL DEFAULT 0, id_user INTEGER UNSIGNED NULL, PRIMARY KEY(id_article) ); CREATE TABLE users ( id_user INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, login VARCHAR(20) NULL, PRIMARY KEY(id_user) ); CREATE TABLE arts_access ( id_user INTEGER UNSIGNED NULL, id_article INTEGER UNSIGNED NULL, PRIMARY KEY(id) );