Sortowanie uczniów wg. ocen

0

.Mam taką tabelę z polami: id INT, id_ucznia INT, imie_ucznia VARCHAR, oceny INT

Jej zawartość:
1, 1, Janek, 4
2, 3, Kasia, 5
3, 3, Kasia, 4
4, 2, Paweł, 3
5, 1, Janek, 4
6, 2, Paweł, 5
7, 2, Kasia, 5
8, 1, Janek, 2
9, 4, Robert, 3
10, 3, Kasia 4
11, 4, Robert, 4
12, 4, Robert, 4

Chciałbym, żeby wyświetlić uczniów w kolejności od najlepszych, do najsłabszych ocen. Z tym, że jeżeli jacyś uczniowie mają piątki, to liczy się liczba piątek (uczeń z większą liczbą piątek będzie przed uczniem z mniejszą liczbą piątek). Jeżeli okaże się, że jacyś uczniowie mają taką samą liczbą piątek, to liczy się liczba czwórek, itd. Chciałbym więc taką kolejność:

  1. Kasia – 5, 5, 4, 4
  2. Paweł – 5, 3
  3. Robert – 4, 4, 3
  4. Janek – 4, 4, 2

Jakim zapytaniem MySQL można by to było osiągnąć? Pewnie trzeba będzie wykorzystać GROUP BY i ORDER BY?

1

Możesz wyliczyć średnią ocen i po prostu posortować tablicę W PHP

1

@zimny Pomidor,
średnią można obliczyć w zapytaniu , ale to i tak nie rozwiąże problemu bo uczeń z ocenami 5,5,4,4 i uczeń z ocenami 5,4 będą mieli takie same średnie czyli 4.5 , a zgodnie z warunkami zdanie ten pierwszy , mający więcej piątek, powinien być wyżej w rankingu

0

Dokładnie tak jak pisze grzegorz_so.

Użyć średniej byłoby najprościej, ale mi nie chodzi o sortowanie wg. średniej ocen, tylko takie sortowanie w którym najpierw liczą się piątki, później czwórki, itd.

Przy sortowaniu wg. średniej ocen kolejność uczniów mających takie oceny:
Uczeń1: 5,1,1,1,1,1,1,1,1,1,1
Uczeń2: 3,3

kolejność byłaby taka:
Uczeń2: (3+3) / 2 = 3
Uczeń1 (5+1+1+1+1+1+1+1+1+1+1) / 11 = 1.36

Uczeń2 byłby wyżej, bo ma wyższą średnią ocen, natomiast mi chodzi oto, żeby o kolejności decydował stopnie, nie średnia:
Uczeń1: 5,1,1,1,1,1,1,1,1,1,1
Uczeń2: 3,3

Uczeń1 byłby wyżej, bo jego najwyższą oceną jest 5, a u Uczńa2 ocena 3.

1

Wiadomo, że liczba ocen będzie mała, więc można to zrobić w ten sposób:
http://sqlfiddle.com/#!2/8c9a5/5

0

Powinienes uzyc funkcji order by ' ' ; -- :)

0

Nie tylko Order by ale także count dla każdej z ocen .... pewno to właśnie miał na myśli Mr.YaHooo pisząc:

Wiadomo, że liczba ocen będzie mała, więc można to zrobić w ten sposób:

Ale podany Link mi nie działa, tak jakby był problem z całym portalem. Także na 100% nie wiem ale myślę, że podał to rozwizanie by zliczyć każda z ocen i posortować od 5 w dół.

0

Faktycznie coś nie działa przykład na sqlfiddle. Zatem tu jest na ideone, nie pamiętam tylko czy to było dokładnie to samo, nie mniej jednak analogiczna metoda.
http://ideone.com/OUlNXW
A w poście kod

    create table tbl(uczen varchar(20), ocena integer);
    insert into tbl values('JANEK',5);
    insert into tbl values('JANEK',5);
    insert into tbl values('JANEK',4);
    insert into tbl values('JANEK',4);
    insert into tbl values('ANIA',5);
    insert into tbl values('ANIA',4);

    SELECT
        uczen,  
        SUM(ocena = 1) AS "1-ki",
        SUM(ocena = 2) AS "2-ki",
        SUM(ocena = 3) AS "3-ki",
        SUM(ocena = 4) AS "4-ki",
        SUM(ocena = 5) AS "5-ki"
    FROM 
        tbl
    GROUP BY 
        uczen
    ORDER BY
        "5-ki" desc,"4-ki" desc,"3-ki" desc,"2-ki" desc,"1-ki" desc;
Wynik:
uczen
1-ki 2-ki 3-ki 4-ki 5-ki
JANEK 0 0 0 2 2
ANIA 0 0 0 1 1
0
SUM(ocena = 1)

nie każda baza łyknie takie wyrażenie

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0