Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: mały problem ze zliczaniem
Forum PHP.pl > Forum > Bazy danych > MySQL
huntercs
dump bazy danych:
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:
  1. SELECT login, u.id_user,
  2. IF(COUNT(DISTINCT b.id)>0, SUM(a.points)/COUNT(DISTINCT b.id), SUM(a.points)) AS punkty,
  3. IF(COUNT(DISTINCT a.id_article)>0, SUM(b.points)/COUNT(DISTINCT a.id_article), SUM(b.points)) AS bonus
  4. FROM arts_users
  5. u
  6. LEFT OUTER JOIN arts_bonus b ON u.id_user=b.id_user
  7. LEFT OUTER JOIN arts_articles a ON (u.id_user=a.id_user AND a.publish=1)
  8. GROUP BY u.id_user
  9. ORDER BY u.id_user ASC


zrzut tabeli w skrócie:
  1. CREATE TABLE bonus (
  2. id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  3. points TINYINT UNSIGNED NULL,
  4. id_user INTEGER UNSIGNED NULL,
  5. PRIMARY KEY(id)
  6. );
  7.  
  8. CREATE TABLE articles (
  9. id_article INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  10. points TINYINT UNSIGNED NULL,
  11. publish TINYINT UNSIGNED NULL DEFAULT 0,
  12. id_user INTEGER UNSIGNED NULL,
  13. PRIMARY KEY(id_article)
  14. );
  15.  
  16. CREATE TABLE users (
  17. id_user INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  18. login VARCHAR(20) NULL,
  19. PRIMARY KEY(id_user)
  20. );
  21.  
  22. CREATE TABLE arts_access (
  23. id_user INTEGER UNSIGNED NULL,
  24. id_article INTEGER UNSIGNED NULL,
  25. PRIMARY KEY(id)
  26. );
FanFataL
Cytat("huntercs")
jeżeli ktoś niema dodanych żadnych punktów bonusowych to niepokazuje jego podstawowych punktów (choć je ma) także nie jest to do końca prawidłowe i szukam dalej innego rozwiązania

  1. SELECT login,
  2. u.id_user,
  3. IF(COUNT(DISTINCT b.id)>0, SUM(a.points)/COUNT(DISTINCT b.id), SUM(a.points)) AS punkty,
  4. IF(COUNT(DISTINCT a.id_article)>0, SUM(b.points)/COUNT(DISTINCT a.id_article), SUM(b.points)) AS bonus
  5. FROM arts_users
  6. u
  7. LEFT OUTER JOIN arts_bonus b ON u.id_user=b.id_user
  8. LEFT OUTER JOIN arts_articles a ON (u.id_user=a.id_user AND a.publish=1)
  9. GROUP BY u.id_user
  10. ORDER BY u.id_user ASC;
btw. zawsze możesz odpowiedzieć na posta smile.gif Nikt Cie za to nie zbije :] (Przycisk Odpowiedz).

Pozdrawiam winksmiley.jpg
...
huntercs
update topicu, wprowadziłem nowy warunek zapytania
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.