Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] Suma punktów użytkownika
Galen
post 19.04.2021, 22:58:16
Post #1





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 19.04.2021

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


Cześć. Jestem mocno początkujący jeśli chodzi o PHP i nie jest to moja bajka, siedzę raczej we front endzie i mam sporą zagwostkę.
Muszę edytować jedną z tabel po facecie, który już nie współpracuje z naszą firmą i sprawa wydawała mi się na początku prosta, jednak nie mogę znaleźć rozwiązania.
Mam tabelę z 4 kolumnami: Data, Imię i nazwisko, Login i Punkty. W bazie danych zapisują się rekordy dodawanych punktów, z tym że każda akcja dodająca punkty tworzy nowy rekord w bazie, dajmy na to:

10.04.2021 | Jan Kowalski | kowal | 10
11.04.2021 | Jan Kowalski | kowal | 20
12.04.2021 | Jan Kowalski | kowal | 15

Poniższy skrypt działa, rozumiem też składnię, jest tu ustawiony limit wyświetlanych rekordów oraz dodana paginacja tabeli. Skrypt wyświetla wszystkie rekordy znajdujące się w bazie.
Problem tkwi w tym, że potrzebuję dokładnie to samo, tyle że z sumą punktów użytkownika, tak żeby dany user wyświetlał się tylko raz, a w kolumnie "Punkty" wyświetlała się suma wszystkich jego punktów.
Próbowałem przy pomocy funkcji array_sum(), ale ona wylicza mi wszystkie rekordy z bazy danych. Skrypt wygląda następująco:


  1.  
  2. <?php
  3.  
  4. $login = $_GET['login'];
  5. $_SESSION["login"] = $login;
  6.  
  7. include('Pagination.php');
  8. include('konfiguracjabazy.php');
  9.  
  10. $limit = 200;
  11. $queryNum = $db->query("SELECT COUNT(*) as ID FROM db_bazaglowna");
  12. $resultNum = $queryNum->fetch_assoc();
  13. $rowCount = $resultNum['ID'];
  14. $pagConfig = array(
  15. 'totalRows' => $rowCount,
  16. 'perPage' => $limit,
  17. 'link_func' => 'searchFilter'
  18. );
  19. $pagination = new Pagination($pagConfig);
  20.  
  21.  
  22. $query = $db->query("SELECT * FROM db_bazaglowna LIMIT $limit");
  23. echo "<center>";
  24. echo "<table id=\"tabela\" cellpadding=\"2\" border=1>";
  25. echo "<tr>";
  26. echo "<th>".'Data'."</th>";
  27. echo "<th>".'Imię i</br> nazwisko'."</th>";
  28. echo "<th>".'Login'."</th>";
  29. echo "<th>".'Punkty'."</th>";
  30. echo "</tr>";
  31. echo "</tr>";
  32.  
  33. if($query->num_rows > 0){
  34. ?>
  35.  
  36. <?php
  37. while($r = $query->fetch_assoc()){
  38.  
  39. echo "<tr>";
  40. echo "<td>".$r['Data']."</td>";
  41. echo "<td>".$r['Imie_I_Nazwisko']."</td>";
  42. echo "<td>".$r['Login']."</td>";
  43. echo "<td>".$r['Ilosc_Punktow']."</td>";
  44. echo "</tr> </center>";
  45.  
  46. }
  47.  
  48. echo $pagination->createLinks();
  49.  
  50. } ?>
  51.  


Będę bardzo wdzięczny za pomoc i podpowiedzi.

Ten post edytował Galen 19.04.2021, 23:06:45
Go to the top of the page
+Quote Post
gino
post 20.04.2021, 07:56:55
Post #2





Grupa: Zarejestrowani
Postów: 319
Pomógł: 52
Dołączył: 18.02.2008

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


Jeżeli tylko tyle jest kolumn, to zrób: SUM(Ilosc_Punktów) i pogrupować GROUP BY (Imie_I_Nazwisko), ale bez konkretnego, unikatowego id użytkownika, możesz pogrupować 2 różnych użytkowników o takim samym imieniu i nazwisku.
Go to the top of the page
+Quote Post
Galen
post 20.04.2021, 13:22:00
Post #3





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 19.04.2021

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


Unikatowy w tym przypadku jest Login, ID użytkowników (i te same przypisane loginy) znajdują się w innej bazie, zdaje sobie sprawę, że można by było to tak zrobić, ale czuję że byłoby to zbyt skomplikowane jak na moje możliwości.
Tylko cały czas coś jest nie tak, poniższa zmiana w kodzie nie działa. Wypluwa tylko nagłówki tabeli.

  1. $query = $db->query("SELECT * FROM db_bazaglowna LIMIT $limit SUM(Ilosc_Punktoww) GROUP BY (Login)");
  2. echo "<center>";
  3. echo "<table id=\"tabela\" cellpadding=\"2\" border=1>";
  4. echo "<tr>";
  5. echo "<th>".'Data'."</th>";
  6. echo "<th>".'Imię i</br> nazwisko'."</th>";
  7. echo "<th>".'Login'."</th>";
  8. echo "<th>".'Punkty'."</th>";
  9. echo "</tr>";
  10. echo "</tr>";
Go to the top of the page
+Quote Post
viking
post 20.04.2021, 13:31:21
Post #4





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

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


Bo nie możesz sobie tak po prostu wstrzelić słowa kluczowe w zapytanie gdzie akurat masz ochotę tylko ma to być zgodnie ze składnią mysql: https://dev.mysql.com/doc/refman/8.0/en/select.html


--------------------
Go to the top of the page
+Quote Post
Galen
post 20.04.2021, 13:57:34
Post #5





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 19.04.2021

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


Ok, zmieniłem kolejność, jednak dalej to samo.

  1. $query = $db->query("SELECT * SUM(Ilosc_Punktow) FROM db_bazaglowna GROUP BY (Imie_I_Nazwisko) LIMIT $limit");


Próbowałem też po Loginie, ale też wyświetla same nagłówki sad.gif.
Go to the top of the page
+Quote Post
gino
post 20.04.2021, 14:02:06
Post #6





Grupa: Zarejestrowani
Postów: 319
Pomógł: 52
Dołączył: 18.02.2008

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


Kod
SELECT *, SUM(Ilosc_Punktow) AS punkty  FROM db_bazaglowna GROUP BY (Imie_I_Nazwisko) LIMIT $limit


edit: sql group by

Ten post edytował gino 20.04.2021, 14:03:59
Go to the top of the page
+Quote Post
Galen
post 20.04.2021, 14:08:49
Post #7





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 19.04.2021

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


Wciąż nic, tylko same nagłówki się pojawiają.

  1. $query = $db->query("SELECT *, SUM(Ilosc_Punktow) AS punkty FROM db_bazaglowna GROUP BY (Imie_I_Nazwisko) LIMIT $limit");
  2.  
  3.  
  4.  
  5. echo "<center>";
  6.  
  7.  
  8. echo "<table id=\"tabela\" cellpadding=\"2\" border=1>";
  9. echo "<tr>";
  10. echo "<th>".'Data'."</th>";
  11. echo "<th>".'Imię i</br> nazwisko'."</th>";
  12. echo "<th>".'Login'."</th>";
  13. echo "<th>".'Punkty'."</th>";
  14. echo "</tr>";
  15. echo "</tr>";
  16.  
  17. if($query->num_rows > 0){ ?>
  18. <div class="posts_list">
  19. <?php
  20. while($r = $query->fetch_assoc()){
  21.  
  22. echo "<tr>";
  23. echo "<td>".$r['Data']."</td>";
  24. echo "<td>".$r['Imie_I_Nazwisko']."</td>";
  25. echo "<td>".$r['Login']."</td>";
  26. echo "<td>".$r['Ilosc_Punktow']."</td>";
  27. echo "</tr> </center>";
  28. }
  29. echo $pagination->createLinks();
  30.  
  31. } ?>
Go to the top of the page
+Quote Post
nospor
post 20.04.2021, 14:52:04
Post #8





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




Bo masz blad bazy. Wyswietl go sobie to zobaczysz co masz zle


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

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Galen
post 20.04.2021, 16:12:49
Post #9





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 19.04.2021

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


Miałeś rację, trochę się z tym pomęczyłem i faktycznie, zamiast "AS Punkty" zadziałało "AS Ilosc_Punktow". Skrypt działa w poniższej formie smile.gif smile.gif.

  1. $query = $db->query("SELECT *, SUM(Ilosc_Punktow) AS Ilosc_Punktow FROM db_bazaglowna GROUP BY (Login) ORDER BY Ilosc_Punktow DESC LIMIT $limit");


Dodałem sobie jeszcze ORDER BY i "ranking" gotowy. Dziękuję Wam wszystkim za pomoc, to była ciężka przeprawa i pierwsze kroki w PHP, sam bym sobie nie poradził wink.gif .

Ten post edytował Galen 20.04.2021, 16:13:55
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 Wersja Lo-Fi Aktualny czas: 29.03.2024 - 01:07