Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Suma punktów użytkownika
Forum PHP.pl > Forum > Przedszkole
Galen
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.
gino
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.
Galen
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>";
viking
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
Galen
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.
gino
Kod
SELECT *, SUM(Ilosc_Punktow) AS punkty  FROM db_bazaglowna GROUP BY (Imie_I_Nazwisko) LIMIT $limit


edit: sql group by
Galen
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. } ?>
nospor
Bo masz blad bazy. Wyswietl go sobie to zobaczysz co masz zle
Galen
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 .
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.