Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]Pozycja w TOP | określenie kryteriów
kielich
post 23.05.2010, 14:01:00
Post #1





Grupa: Zarejestrowani
Postów: 442
Pomógł: 4
Dołączył: 28.12.2008
Skąd: Warszawa

Ostrzeżenie: (20%)
X----


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ć ?


--------------------
Życie jest jak SESJA kiedyś wygaśnie ....

Jeśli moja odpowiedź jakoś Cię nakierowała lub pomogła kliknij Pomógł
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 14)
tehaha
post 23.05.2010, 14:29:19
Post #2





Grupa: Zarejestrowani
Postów: 1 748
Pomógł: 388
Dołączył: 21.08.2009
Skąd: Gdynia

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


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
Go to the top of the page
+Quote Post
kielich
post 23.05.2010, 14:38:55
Post #3





Grupa: Zarejestrowani
Postów: 442
Pomógł: 4
Dołączył: 28.12.2008
Skąd: Warszawa

Ostrzeżenie: (20%)
X----


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

Ten post edytował kielich 23.05.2010, 14:40:20


--------------------
Życie jest jak SESJA kiedyś wygaśnie ....

Jeśli moja odpowiedź jakoś Cię nakierowała lub pomogła kliknij Pomógł
Go to the top of the page
+Quote Post
tehaha
post 23.05.2010, 14:48:24
Post #4





Grupa: Zarejestrowani
Postów: 1 748
Pomógł: 388
Dołączył: 21.08.2009
Skąd: Gdynia

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


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
Go to the top of the page
+Quote Post
kielich
post 23.05.2010, 14:55:19
Post #5





Grupa: Zarejestrowani
Postów: 442
Pomógł: 4
Dołączył: 28.12.2008
Skąd: Warszawa

Ostrzeżenie: (20%)
X----


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


--------------------
Życie jest jak SESJA kiedyś wygaśnie ....

Jeśli moja odpowiedź jakoś Cię nakierowała lub pomogła kliknij Pomógł
Go to the top of the page
+Quote Post
tehaha
post 23.05.2010, 15:04:30
Post #6





Grupa: Zarejestrowani
Postów: 1 748
Pomógł: 388
Dołączył: 21.08.2009
Skąd: Gdynia

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


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
Go to the top of the page
+Quote Post
marcio
post 23.05.2010, 15:08:23
Post #7





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


  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.


--------------------
Zainteresowania: XML | PHP | MY(SQL)| C# for .NET | PYTHON
http://code.google.com/p/form-builider/
Moj blog
Go to the top of the page
+Quote Post
Cienki1980
post 23.05.2010, 15:17:26
Post #8





Grupa: Przyjaciele php.pl
Postów: 1 590
Pomógł: 40
Dołączył: 11.01.2007
Skąd: Centrum

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


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


--------------------
404
Go to the top of the page
+Quote Post
kielich
post 23.05.2010, 15:20:22
Post #9





Grupa: Zarejestrowani
Postów: 442
Pomógł: 4
Dołączył: 28.12.2008
Skąd: Warszawa

Ostrzeżenie: (20%)
X----


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ę)



--------------------
Życie jest jak SESJA kiedyś wygaśnie ....

Jeśli moja odpowiedź jakoś Cię nakierowała lub pomogła kliknij Pomógł
Go to the top of the page
+Quote Post
tehaha
post 23.05.2010, 15:36:10
Post #10





Grupa: Zarejestrowani
Postów: 1 748
Pomógł: 388
Dołączył: 21.08.2009
Skąd: Gdynia

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


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

Ten post edytował tehaha 23.05.2010, 15:40:58
Go to the top of the page
+Quote Post
kielich
post 23.05.2010, 16:02:30
Post #11





Grupa: Zarejestrowani
Postów: 442
Pomógł: 4
Dołączył: 28.12.2008
Skąd: Warszawa

Ostrzeżenie: (20%)
X----


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 ?!


--------------------
Życie jest jak SESJA kiedyś wygaśnie ....

Jeśli moja odpowiedź jakoś Cię nakierowała lub pomogła kliknij Pomógł
Go to the top of the page
+Quote Post
tehaha
post 23.05.2010, 16:10:24
Post #12





Grupa: Zarejestrowani
Postów: 1 748
Pomógł: 388
Dołączył: 21.08.2009
Skąd: Gdynia

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


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
Go to the top of the page
+Quote Post
kielich
post 23.05.2010, 16:15:30
Post #13





Grupa: Zarejestrowani
Postów: 442
Pomógł: 4
Dołączył: 28.12.2008
Skąd: Warszawa

Ostrzeżenie: (20%)
X----


No ok ale kiedy to wywalę z tej pętli to nic mi się nie wyświetla w $position questionmark.gif...


--------------------
Życie jest jak SESJA kiedyś wygaśnie ....

Jeśli moja odpowiedź jakoś Cię nakierowała lub pomogła kliknij Pomógł
Go to the top of the page
+Quote Post
tehaha
post 23.05.2010, 16:22:35
Post #14





Grupa: Zarejestrowani
Postów: 1 748
Pomógł: 388
Dołączył: 21.08.2009
Skąd: Gdynia

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


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:)
Go to the top of the page
+Quote Post
kielich
post 23.05.2010, 16:28:36
Post #15





Grupa: Zarejestrowani
Postów: 442
Pomógł: 4
Dołączył: 28.12.2008
Skąd: Warszawa

Ostrzeżenie: (20%)
X----


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


--------------------
Życie jest jak SESJA kiedyś wygaśnie ....

Jeśli moja odpowiedź jakoś Cię nakierowała lub pomogła kliknij Pomógł
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: 24.07.2025 - 22:57