![]() |
![]() ![]() |
![]() |
![]() ![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 76 Pomógł: 1 Dołączył: 5.09.2007 Ostrzeżenie: (0%) ![]() ![]() |
Witam,
Kompletnie nie mam pomysłu jak to rozegrać. Postaram się to przedstawić jak najlepiej. Baza wygląda tak: ---user_id--------points--- -----1-------- 2, 4, 5, 1, 1 -----2-------- 1, 1, 1, 1, 1 -----3-------- 4, 5, 7, 2, 1 -----4-------- 1, 1, 1, 9, 9 Czyli jest 4(lub więcej) użytkowników i każdy ma jakieś tam punkty. Co chcę uzyskać to: żeby skrypt wyciągnął z bazy wszystkich użytkowników i policzył im ile każdy ma punktów "1". Czyli: user 1 ma 2 x 1 -> 2 user 2 ma 5 x 1 -> 5 user 3 ma 1 x 1 -> 1 user 4 ma 3 x 1 -> 3 Dodatkowo ! Każdy user ma swój login. I chcę by po zalogowaniu widział on wszystkie punkty, ale żeby nie było zdradzone czyje to są punkty (oprócz niego samego). Czyli: user 3 po zalogowaniu widzi 5 3 2 1 <- To są twoje punkty a user 4 widzi: 5 3 <- To są twoje punkty 2 1 To tyle, bardzo proszę o podsuwanie pomysłów ![]() |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Zły projekt bazy. Powinieneś mieć osobną tabelę z kolumną user_id (będącą odniesieniem do id z tabeli user) oraz drugą kolumnę point. Przy pomocy standardowych COUNT(), GROUP itp. byłbyś w stanie takie rzeczy wyciągnąć.
|
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 76 Pomógł: 1 Dołączył: 5.09.2007 Ostrzeżenie: (0%) ![]() ![]() |
Dziękuję za odpowiedź!
Uh... rozumiem, że tak musi być ze względu na ten wyjątek co do wyświetlania danych dla konkretnych osób tak ? Z tym akurat nie powinno być problemu gdyż login jest np. user4 a wewnątrz jest funkcja explode która oddziela "4" i na tej podstawie wyszukuje z bazy po user_id. Zapomniałem wspomnieć o 1 ważnej rzeczy (na początku wydawała mi się nieważna, ale teraz widze ze jest). Czasami elementy się powtarzają tj. ---user_id--------points--- -----1-------- 2, 4, 5, 1, 1 -----2-------- 1, 1, 1, 1, 1 -----3-------- 4, 5, 7, 2, 1 -----1-------- 2, 1, 3, 4, 1 -----2-------- 7, 8, 9, 1, 1 -----1-------- 8, 1, 1, 1, 2 -----4-------- 1, 1, 1, 9, 9 Czyli user_id może się powtórzyć nawet kilka razy! Nie należy milyć user_id ze zwykłym "id" który jest kluczem podstawowym + auto_incr. czy to coś zmienia ? Wtedy te "1" są wyciągane z 3 rekordów i wszystkiee musiałyby być zsumowane Pozdrawiam |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
1) Te points to co to ma być w ogóle?
2) Tak powinno być ponieważ zapewne pracujesz z bazą dla której jest to bardziej naturalny format zapisu danych (np. PostgreSQL) 3) W pewnych przypadkach można zapisywać takie coś w postaci "1,2,3,45,6,7" - ale ten raczej nie jest takim przypadkiem. |
|
|
![]()
Post
#5
|
|
![]() Grupa: Moderatorzy Postów: 6 072 Pomógł: 861 Dołączył: 10.12.2003 Skąd: Dąbrowa Górnicza ![]() |
Jak już wspomniano wcześniej projekt bazy jest do kitu. No ale skoro jest jak jest to możesz policzyć wystąpienia znaków poprzez count_chars. Liczy to liczby wystąpień znaków, czyli jeśli ktoś będzie miał np. 11 to policzy to jako 2 wystąpienia 1, a nie 1 wystąpienie 11. Jeżeli liczby te masz z przedziału 0-9 (czyli cyfry) to nie będzie problemu.
|
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 76 Pomógł: 1 Dołączył: 5.09.2007 Ostrzeżenie: (0%) ![]() ![]() |
To mogło by rozwiązać mój problem.
Ale oczywiście jestem otwarty na sugestie lub uwagi bo to pozwoli mi uniknąć błędów w przyszłości. @crozin, prosiłes o wyjaśnieni Na stronie używam (niestety gotowego) aczkolwiek bardzo bardzo fajnego mysqlajaxtableeditor. To jest taki panel do wpisywania rekordów przy użyciu AJAX. Po wprowadzeniu własnych pól struktura wygląda tak: Cytat ----id----numer----punkty----- id -- oczywiscie, primo + auto increment nr -- to numer zawodnika punkty -- to punkty jakie zdobył w danej rundzie rund jest kilka(pięciu sędziów i każdy wystawia punkt), ale ich nie ma w bazie bo nie potrzebowałem tych danych. Tak więc czasami nr zawodnika się powtarza No i jak już napisalem, moze to wygladać tak Cytat ----id----numer----punkty----- ----1------1----- 2, 4, 5, 1, 1 ----2------1----- 3, 9, 8, 1, 1 ----3------1----- 4, 5, 1, 1, 2 ----4------2----- 1, 3, 3, 2, 6 ----5------2----- 7, 8, 1, 9, 8 No i teraz chciałem stworzyć takie Hall of Shame czyli żeby podliczył ile dany zawodnik ma w sumie punktów "1". W tym przypadku zawodnik 1 ma 6 x 1 czyli 6 takich punktów, a zawodnik 2 x 1 czyli 2 takie punkty ![]() No i to co mówiłem, żeby zawodnik 1 po zalogowaniu się widział wszystkie punkty, ale żeby tylko przy jego ilości pokazało się, że są to jego punkty. Czy teraz jest to jasne ? ![]() W takim razie co powinienem zrobić w tej bazie żeby była bardziej elastyczna wg was ? ![]() Ten post edytował Morfi777 27.10.2009, 22:05:37 |
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Punkty powinny być w osobnej tabeli, każdy w osobnym rekordzie. Dzięki temu przy pomocy COUNT() i GROUP BY będziesz w stanie określić ilość punktów każdego zawodnika.
|
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 76 Pomógł: 1 Dołączył: 5.09.2007 Ostrzeżenie: (0%) ![]() ![]() |
Coś zacząłem, ale nie radze sobie
W wyniku dostaje 2,2,2,2,2,2,2,2,2,3,3,3,3,3,3 zamiast samego 3 ![]() dlatego ze jest 15 rund, a w sumie punktow 1 było 3. Jak pokazać tylko ostatni (15) wynik? |
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
No ale przecież napisałem, że powinieneś przede wszystkim zmienić fatalną strukturę bazy danych.
|
|
|
![]()
Post
#10
|
|
![]() Grupa: Zarejestrowani Postów: 76 Pomógł: 1 Dołączył: 5.09.2007 Ostrzeżenie: (0%) ![]() ![]() |
W porządku, wiem co napisałeś tyle że w tym przypadku to jest a wykonalne jeżeli dalej mam używać tego panelu.
Powiedz mi chociaż jak się wyświetlają te liczby, co to jest. te 222222222333333 Bo to nie jest 1 string tylko 15 rożnych ciągów (po 1 znaku). To też nie jest array, to co to jest ? I jak mogę odseparować tylko ostatni z nich ? |
|
|
![]()
Post
#11
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Jeśli zależy Ci na określonym znaku to użyj substr. Przy czym przydaną ciekawostką jest używanie tam parametrów ujemnych, co nieraz się przydaje. Nawet w twoim przypadku dobrą alternatywą, bo ostatni element ciągu znakowego to
substr($ciag, -1) Popatrz na manual i przykłady w nim oraz komentarzach do tej funkcji bo jest to prosto wytłumaczone tam. -------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]()
Post
#12
|
|
![]() Grupa: Zarejestrowani Postów: 76 Pomógł: 1 Dołączył: 5.09.2007 Ostrzeżenie: (0%) ![]() ![]() |
Dzięki, ale właśnie powiedziałem, że to nie działa ponieważ to jest 15 różnych ciągów,a nie 1 !
To że on się wyświetla razem nie oznacza, że jest to 1 string ![]() Stąd moje pytanie. Skoro to NIE jest 1 ciąg, i to nie jest array(15). To co to jest ? I jak to odseparować. |
|
|
![]()
Post
#13
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Teraz zauważyłem, że to nie konkatenacja tylko zwykle dodawanie
![]()
Dzięki deklaracji i inicjalizacji $policz jeszcze przed pętlą, możemy się po zakończeniu pętli do niej odwołać. Sprawdź sobie zresztą na kod a sam dojdziesz do wniosku, że to nie array, nie string, a poczciwy int, ale wielokrotnie wypisany na ekran ![]() -------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]()
Post
#14
|
|
![]() Grupa: Zarejestrowani Postów: 76 Pomógł: 1 Dołączył: 5.09.2007 Ostrzeżenie: (0%) ![]() ![]() |
Teraz zauważyłem, że to nie konkatenacja tylko zwykle dodawanie ![]() [PHP] pobierz, plaintext
Dzięki deklaracji i inicjalizacji $policz jeszcze przed pętlą, możemy się po zakończeniu pętli do niej odwołać. Sprawdź sobie zresztą na kod a sam dojdziesz do wniosku, że to nie array, nie string, a poczciwy int, ale wielokrotnie wypisany na ekran ![]() Jestem Ci przeogromnie wdzięczny. Już nie raz miałem ten sam problem, że nie wiedziałem jak zachować zmienną PO wyjściu z pętli. Teraz już wiem, że wystarczy ją określić PRZED pętlą ![]() ![]() ![]() Pozdrawiam Jak mogę posortować te liczby od największej do najmniejszej ? |
|
|
![]()
Post
#15
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
"Te liczby" to znaczy które? Wszystkie pojedyncze wypisania na ekran zmiennej $policz w pętli, które przybrały postać
2,2,2,2,2,2,2,2,2,3,3,3,3,3,3 i gdzie interesowała Cię tylko ostatnia czy jakieś inne liczby, które są przebiegiem choćby innej pętli, która jest nie dla jednego gracza, ale wszystkich? Jeśli to drugie, to $policz dodawaj do jakiejś tablicy wraz z danymi określającymi gracza jakiego tyczą i potem tylko posortuj ją. Istnieją funkcje do sortowania tablic, więc zapoznaj się z nimi w manualu ![]() Jeśli jednak chciałbyś posortować owo 2,2,2,2,2,2,2,2,2,3,3,3,3,3,3 (nie widzę w tym sensu, ale to szczegół) to każdą $policz dodawaj jako kolejny element do tablicy i też ją potem posortuj. EDIT: By Ci pomóc dodam, że masz zerknąć na te z "sort" w nazwie i u z przodu i zdefiniować własna funkcję porównująca wywoływaną jako callback, ale omiń usort, bo ona zlikwiduje Ci Twoje klucze zastępując własnymi ;)Brzmi trudno ale masz proste przykłady w manualu więc powinieneś dać sobie radę. Ten post edytował thek 29.10.2009, 13:09:13 -------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 19.07.2025 - 17:18 |