Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Pozycja w TOP | określenie kryteriów
Forum PHP.pl > Forum > Przedszkole
kielich
Witam,

Mam pewien problem w kwestii teoretycznej , chciałem zrobić na stronie z filmami pozycje na której znajduje się film. Każdy film mam oceniany poprzez glosowanie

np.

film1 - 3,54
film2 - 4,06
film3 - 2,58


itd

I potrzebuje teraz zrobić tak :

- kiedy wchodzę w opis np. filmu1 widzę " Film znajduje się w TOP 2"
- kiedy wchodzę w opis np. filmu2 widzę " Film znajduje się w TOP 1"
- kiedy wchodzę w opis np. filmu3 widzę " Film znajduje się w TOP 3"

Całkowicie nie wiem jak to obrać ... sad.gif

Z góry bardzo dziękuje

Czy ktoś wie jak to mogę zrobić ?
tehaha
możesz pobrać sobie 20 najwyżej ocenionych filmów sortując je oceną malejąco,
film2 - 4,06
film1 - 3,54
film3 - 2,58
itd...
zapisujesz je po kolei do tablicy:
  1. $top_movies[] = $movie_id;

potem sprawdzasz funkcją in_array(), czy film znajduje się w tej tablicy jeżeli tak to funkcją array_search() pobierasz klucz, klucz+1 - będzie numerem pozycji na, której znajduje się film i wtedy w zależności jaka to liczba piszesz czy to jest TOP3, TOP10 czy TOP20
kielich
No tak tylko jest mały problem który nie wiem jak obejść ponieważ muszę to zgrać jakoś z takim zapytaniem

  1. SELECT tab1.* , tab2.* FROM tab2
  2. LEFT JOIN tab1 ON tab1.id = tab2.id
  3. WHERE tab1.id = 'np.3'
  4. GROUP BY tab2.id


wiec pobieram tylko dla konkretnego ID (wchodzę w opis filmu)

Ps. dziękuje za odp. która daje mi cień na to że jakoś to zrobię smile.gif ....

tehaha - Jakiś przykład mógłbym poprosić questionmark.gif
tehaha
nie wiem co wyciąga to Twoje zapytanie, ale domyślam się, że jakieś informacje o filmie..., a nie możesz oddzielnym zapytaniem wyciągnąć tego top20? chodzi po prostu żebyś wyciągnął ID dla 20 filmów z największą średnią i wsadził to do tablicy
kielich
Też tak właśnie pomyślałem (po tym jak odpisałem) że mogę przecież od dzielnie napisać zapytanie . smile.gif
Czy mógłbyś podać jakiś przykład jak to mogę rozwiązać , podtrzymując dalej twoją ideę .
tehaha
ok to taki przykład, który zobrazuje Ci jak to mniej więcej może działać, oczywiści musisz to dopasować do swojej sytuacji:
pobieramy TOP20 filmów, sortując je względem oceny od najwyższej do najniższej
  1. $top_movies = array();
  2. //pobieramy 20 najwyżej ocenionych filmow i wkładamy je do tablicy zachowując kolejność
  3. $sql = "SELECT movie_id, (vote_sum/vote_count) as rank FROM movies ORDER BY rank DESC";
  4. if($result = mysql_query($sql))
  5. {
  6. $top_movies[] = $row['movie_id'];
  7. }
  8. print_r($top_movies);


potem kiedy już sobie pobierzesz informacje o filmie i masz jego ID, to sprawdzasz czy jest w TOP20, jeśli tak to na jakiej pozycji:
  1. //sprawdzamy czy film jest w top 20
  2. if(in_array($movie_id, $top_movies))
  3. {
  4. $position = array_search($movie_id, $top_movies) +1; // dodajemy jeden bo w tablicy numeracja zaczyna się od 0
  5. }
  6. if($position <=3 )
  7. {
  8. echo "film znajduje się w TOP3";
  9. }elseif($position > 3 && $position <=10)
  10. {
  11. echo "film znajduje się w TOP10";
  12. }


Oczywiście żeby na każdej podstronie filmu, zbędnie nie wykonywać połączenia do pobierania top20, można zapisać je do sesji:
  1. $_SESSION['top_movies'] = array();
  2. $_SESSION['top_movies'] = $top_movies;


i wtedy już do funkcji in_array() i array_search() używasz tej zmiennej sesyjnej
marcio
  1. SELECT tab1.* , tab2.*, (SELECT ocena FROM tabela ORDER BY ocena DESC LIMIT 10) AS top FROM tab2
  2. LEFT JOIN tab1 ON tab1.id = tab2.id
  3. WHERE tab1.id = 'np.3'
  4. GROUP BY tab2.id

Dawno ze Sql nie kombinowalem ale zobacz czy dziala tylko pozmieniaj nazwy kolumn i tabel i potem za pomoca php wyciagnij to co chcesz.
A jak nie to za pomoca max() z mysql'a wyciagnij najwyzsza ocene.
Ewentualnie mozesz uzyc Union select.
Cienki1980
A nie lepiej zamiast kombinować z zapytaniami, lub porównywać tablice w PHP dodać jedno nadmiarowe pole w opisie filmu i tam zapisywać aktualną pozycję ?
Każde głosowanie ( notabene głosując na film głosujesz na jego stronie - więc masz jego ID ) uaktualnia kolumnę 'pozycja'.
kielich
Wszystko super no ale nie rozumiem twojego rozumowania .
  1.  
  2. if($position <=3 )
  3. {
  4. echo "film znajduje się w TOP3";
  5. }elseif($position > 3 && $position <=10)
  6. {
  7. echo "film znajduje się w TOP10";
  8. }


BO jeśli $position będzie równa 2 wtedy będzie zaliczane do TOP3 a powinno być do 2 ... Dobrze to rozumuje smile.gif


Ps. trochę na początku się zle wyraziłem ponieważ nie ma być jakiś tam TOP do 20 tylko każdy film ma swoją ocenę i względem innych filmów ma jakąś pozycje smile.gif
no ale to chyba nic tu nie zmienia ... smile.gif

Cienki1980

Niby tak ale to w moim przypadku strasznie dużo przeróbek itd...
A idea tehaha jest bardzo dobra (tak myślę)

tehaha
a bo myślałem, że chcesz sobie wypisywać czy to top3 czy top10, no nie ważne wtedy tylko wyświetl $position bo to jest właśnie pozycja względem innych filmów, dlatego podkreślałem, żebyś wyciągnął je w posortowane malejąco oceną, jeżeli ma być dla większej liczby niż 20 to wyciągnij wszystkie ID filmów, posortowane oceną malejąco

@Cienki1980 Twoje rozwiązanie wymagało by cyklicznej aktualizacji tej pozycji, przecież ludzie dodają oceny i ta pozycja ciągle się zmienia, a to de facto wprowadziło by większe komplikacje, bo przecież trzeba by po każdym oddanym głosie zaktualizować pozycję dla wszystkich filmów
kielich
Dziwne zrobiłem tak:

  1. if($result = mysql_query($ranking))
  2. {
  3. while($row=mysql_fetch_array($result))
  4. {
  5. $top_movies[] = $row['id_rekordy'];
  6. if(in_array($row['id_rekordy'], $top_movies))
  7. {
  8. $position = array_search($row['id_rekordy'], $top_movies) +1;
  9. }
  10. }
  11. }
  12. echo $position;


i wyświetla mi " 15 " czyli liczba wszystkich rekordów ... kurcze gdzie się zamieszałem ?!
tehaha
linijki 6-9 wywal z pętli bo one służą do sprawdzenia na jakiej pozycji jest film, poza tym to id filmu to ma pochodzić z informacji pobieranych o filmie, zamieszałeś w tym że to połączyłeś
1. to przypisanie filmów do tablicy to zupełnie oddzielne połączenie tworzysz sobie taką tablice z numerami ID posegregowane względem oceny
2. potem jak sobie pobierasz informacje o filmie to wtedy używając tego id, którym pobrałeś info filmu sprawdzasz w tej tablicy na jakiej pozycji znajduje się film
kielich
No ok ale kiedy to wywalę z tej pętli to nic mi się nie wyświetla w $position questionmark.gif...
tehaha
to jest oddzielna część i ma za zadanie tylko i wyłącznie przypisać do tablicy numery ID filmów, tak aby to potem użyć przy wyświetlaniu filmu

  1. if($result = mysql_query($ranking))
  2. {
  3. while($row=mysql_fetch_array($result))
  4. {
  5. $top_movies[] = $row['id_rekordy'];
  6. }
  7. }
  8. print_r($top_movies);


i to takie sobie zostawiasz, aby się dodatkowo upewnić, że wpisałeś poprawnie te numer ID do tablicy dajesz print_r(), żeby sprawdzić czy tablica nie jest pusta

POTEM kiedy sobie wchodzisz na stronę filmu i wykonujesz zapytanie aby pobrać informacje o filmie to robisz coś w stylu

  1. $sql = "SELECT nazwa_filmu itd FROM filmy WHERE id_filmu = '$id_filmu'";


pobierasz sobie informacje i używając tego samego ID który używasz do pobrania informacji o filmie sprawdzasz w tamtej tablicy które ma miejsce

  1. if(in_array($id_filmu, $top_movies))
  2. {
  3. $position = array_search($id_filmu, $top_movies) +1;
  4. }

jaśniej się już chyba nie da:)
kielich
A no dobrze zrobiłem , tylko wiesz ja mam całkiem inną koncepcje całego kodu no ale działa jak należy w $id_filmu wrzuciłem sobie GET'a z ID i śmiga smile.gif
Myślę że teraz jest już wszystko tak jak chciałem w razie czego będę pisał

Bardzo Ci dziękuje za pomoc smile.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.