Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Średnia z ocen i sortowanie
Forum PHP.pl > Forum > Bazy danych > MySQL
Serans
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.
mike
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
Shili
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 ^^
piotrooo89
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
phpion
@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
Shili
@Phpion - nie ma możliwości założenia tutaj klucza. Trzeba by było dodać jeszcze identyfikator dla oceny_lub_punkty winksmiley.jpg
phpion
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.
Shili
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 ^^
Serans
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.
Shili
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
cojack
  1. SELECT id, avg(ocena) FROM nazwa_tabeli ORDER BY avg(ocena) DESC LIMIT 0, 5;

Top 5 z najwyższą średnią winksmiley.jpg
phpion
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.
cojack
  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.
Serans
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
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.