Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Średnia z ocen i sortowanie
Serans
post
Post #1





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 17.06.2008

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


Witam,

Mam przygotowaną tablkę o wartościach np.

ID| Ocena
1 | 2,5,8,2,3
2 | 4,5,3,2,1,5
3 | 1,1,10,8,4
...

Potrzebuje zrobić TOP5, gdzie TOP1 to ID z najwyższą średnią oceną. Dla każdego pojedyńczego ID wyliczenie średniej to nie problem bo wystarczy skorzystać z explode(), ale nie wiem jak powinno wyglądać zapytanie, które sortowało by wyniki od najwyższej do najniższej średniej.
Go to the top of the page
+Quote Post
mike
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


Wyrzuć bazę do kosza i zaprojektuj ją od nowa.
Przecież to co masz to głupota.

W bazie w jednym polu jest jedna wartość. I kropka.
A nie wiele wartości w stylu 2,5,8,2,3
Go to the top of the page
+Quote Post
Shili
post
Post #3





Grupa: Zarejestrowani
Postów: 1 085
Pomógł: 231
Dołączył: 12.05.2008

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


Tak naprawdę w takim stanie, w jakim masz zaprojektowaną tabelę musisz policzyć średnie wszystkich wierszy, zapisać to np w jakiejś tablicy, posortować tablicę i wybrać pięć wartości od góry albo od dołu (w zależności czy sortowanie malejące czy rosnące).

Czyli totalnie bez sensu ^^

Ten post edytował Shili 18.06.2008, 15:39:29
Go to the top of the page
+Quote Post
piotrooo89
post
Post #4


Newsman


Grupa: Moderatorzy
Postów: 4 005
Pomógł: 548
Dołączył: 7.04.2008
Skąd: Trzebinia/Kraków




3 tabelki:
uczen
ocena
ocenauczen

w 1:
id
imie
nazwisko

w 2:
id
ocena

w 3:
id_ucznia
id_oceny

i możesz przypisać kilka ocen jednemu uczniowi. później wybierasz wszystkie oceny jednego ucznia i liczysz


--------------------
Go to the top of the page
+Quote Post
phpion
post
Post #5





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




@piotrooo89:
Twój pomysł również nie należy do najlepszych smile.gif nie widzę sensu robienia relacji ocena---ocenauczen.

Mój typ!
uczniowie: id, imie, nazwisko
przedmioty: id, nazwa (hehe nikt nigdzie nie wspomniał o przedmiotach *)
oceny: uczen_id, przedmiot_id, ocena, data (żeby można śledzić postępy w nauce)

Tyle. Wg mnie to załatwia wszystkie problemy. Poza tym spełniona jest 3 postać normalna, a o to chodzi.

* łoj, zasugerowałem się postem powyżej. Nigdzie nie ma mowy tym, że to oceny szkolne (tym bardziej patrząc na przykładowe dane jest to raczej nierealne tongue.gif) więc wtedy:

jakas_tabelka: id, imie, nazwisko
oceny_lub_punkty: jakas_tabelka_id, ocena_lub_punkt

Ten post edytował phpion 18.06.2008, 17:56:59
Go to the top of the page
+Quote Post
Shili
post
Post #6





Grupa: Zarejestrowani
Postów: 1 085
Pomógł: 231
Dołączył: 12.05.2008

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


@Phpion - nie ma możliwości założenia tutaj klucza. Trzeba by było dodać jeszcze identyfikator dla oceny_lub_punkty winksmiley.jpg
Go to the top of the page
+Quote Post
phpion
post
Post #7





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Zgadzam się. To tylko zarys. Najprościej wprowadzić id, ale może autor tematu chciałby skorzystać z klucza głównego obejmującego więcej niż 1 kolumnę (np. jakas_tabelka_id + data). Aczkolwiek id to zdecydowanie najprostsze (i możliwe, że najlepsze) rozwiązanie.
Go to the top of the page
+Quote Post
Shili
post
Post #8





Grupa: Zarejestrowani
Postów: 1 085
Pomógł: 231
Dołączył: 12.05.2008

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


Z datą myślę, że niekoniecznie - w końcu jeśli to oceny to można dostać z jednego przedmiotu kilka jednego dnia. A zakładanie klucza na więcej niż trzy pola mija się moim zdaniem z celem - dlatego zaproponowałam ze swojej strony id.

Ale jak zarys, to ok ^^
Go to the top of the page
+Quote Post
Serans
post
Post #9





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 17.06.2008

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


To co przedstawiłem to był tylko mały fragment mojej tabeli. W rzeczywistości jest ona trochę większa ale tylko z tym fragementem mam problem. W skrypcie chodzi o ocenianie filmików. Zależało mi jeszcze na tym aby baza zapamiętywała jaką ocene wystawił użytkownik.
Miałem dwa wiersze zwiazane z ocenianiem

ID| Ocena | Ocena_user_id
1 | 2,3,4,5|212,150,100,320
...
Dzięki temu mogłem z wykorzystaniem explode sprawdzić czy lub jaką ocene dał użytkownik w filmiku o ID, w tym przypadku 1

Ale teraz widze, że w ogole nie przemyślalem sprawy. Wszystko działa ale można to było zrobić o wiele lepiej np.

Tabela Oceny:

ID
Ocena
User_id
Video_id

Już nie wspomnę o tym jak sobie poradziłem z komentarzami. Mam jakąs podswiadoma obawe ze im wiecej tabel i wierszy tym gorzej winksmiley.jpg
Dziękuje za pomoc.
Go to the top of the page
+Quote Post
Shili
post
Post #10





Grupa: Zarejestrowani
Postów: 1 085
Pomógł: 231
Dołączył: 12.05.2008

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


Oczywiście, jeśli tabele są robione w nieprzemyślany sposób i do zrealizowania każdej relacji, nawet jeden do jeden są osobne tabele to nie jest dobrze. Jednak dużo wolniejsze jest, kiedy musisz sam wyłuskiwać te rekordy - baza danych została tak napisana i zoptymalizowana, że pobieranie i explode są wolniejsze i mniej wydajne. W innym przypadku zapewne programiści struktur baz danych zaczęliby iść w takim dokładnie kierunku winksmiley.jpg
Go to the top of the page
+Quote Post
cojack
post
Post #11





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

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


  1. SELECT id, avg(ocena) FROM nazwa_tabeli ORDER BY avg(ocena) DESC LIMIT 0, 5;

Top 5 z najwyższą średnią winksmiley.jpg


--------------------
cojack blog - mój blog (na jakiś czas off).
"jak czegoś nie wiem, to nie myślę że wiem" - moja domena
Go to the top of the page
+Quote Post
phpion
post
Post #12





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Cytat(cojack @ 19.06.2008, 00:01:04 ) *
  1. SELECT id, avg(ocena) FROM nazwa_tabeli ORDER BY avg(ocena) DESC LIMIT 0, 5;

Top 5 z najwyższą średnią winksmiley.jpg

Sratatata. Sprawdzałeś to, co napisałeś? Należałoby dodać jeszcze GROUP BY.
Go to the top of the page
+Quote Post
cojack
post
Post #13





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

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


  1. SELECT id, avg(ocena) FROM nazwa_tabeli WHERE id >= 0 GROUP BY id HAVING avg(ocena)>0 ORDER BY avg(ocena) DESC LIMIT 0, 5;


Antydebilne zapytanie.

@EDIT

w sumie te zapytanie nie powinno działać ponieważ on ma w jednej komórce wiele danych.

Ten post edytował cojack 19.06.2008, 12:08:37


--------------------
cojack blog - mój blog (na jakiś czas off).
"jak czegoś nie wiem, to nie myślę że wiem" - moja domena
Go to the top of the page
+Quote Post
Serans
post
Post #14





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 17.06.2008

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


Troche sie pomęczyłem i przeksztalcilem baze danych i skrypt. Mam juz teraz w kazdym polu po jedna wartosc, wiec zapytanie bedzie pewnie dzialac
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 Aktualny czas: 21.08.2025 - 06:38