Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> mały problem ze zliczaniem
huntercs
post
Post #1





Grupa: Zarejestrowani
Postów: 94
Pomógł: 0
Dołączył: 6.02.2005

Ostrzeżenie: (0%)
-----


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. );


Ten post edytował huntercs 7.03.2006, 22:53:48


--------------------


Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 2)
FanFataL
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 13
Pomógł: 0
Dołączył: 6.09.2005
Skąd: Kraków / Katowice / Bydgoszcz

Ostrzeżenie: (0%)
-----


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
...

Ten post edytował FanFataL 6.03.2006, 03:03:48


--------------------
The people who are trying to make this world worse are not taking a day off. How can I? - Light up the darkness
Go to the top of the page
+Quote Post
huntercs
post
Post #3





Grupa: Zarejestrowani
Postów: 94
Pomógł: 0
Dołączył: 6.02.2005

Ostrzeżenie: (0%)
-----


update topicu, wprowadziłem nowy warunek zapytania


--------------------


Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 02:41