Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL]Jak z danych tabeli zrobic ranking
Forum PHP.pl > Forum > Przedszkole
-jymbox-
Najlepiej wydaje mi sie ze opisze to na przykladzie:

tabela wynikow na Wielkiej Krokwi

id nazwa metrow rok
1 Czesiek 125 2001
2 Wiesiek 132 2001
3 Stefek 140 2001
4 Czesiek 143.5 2002
5 Wiesiek 124 2002
6 Stefek 115 2002
7 Czesiek 129 2003
8 Wiesiek 137 2003
9 Stefek 120 2003
itd.

i teraz tak... kolejonosc w danym roku to nie problem radze sobie ale zeby zrobic taki ranking wszechczasow na Wielkiej Krokwi to juz mi stwarza problem probowalem ze naprawde wielu rzeczy i distinct i group by i tabele pomocnicze i nigdy nie udalo mi sie otrzymac poprawnych danych np. dla tabeli powyzej dane powinny wygladac tak:

miejsce id nazwa metrow rok
1 4 Czesiek 143.5 2002
2 3 Stefek 140 2001
3 8 Wiesiek 137 2003

tylko wlasnie o to mi chodzi zeby raz pokazywalo danego zawodnika i tylko z jego najlepszym wynikiem oczywiscie niestety mi nie udawalo sie wyciagnac tych danych tak zeby grupowalo z najepszym wynikiem tylko zawsze z najgorszym badz z pierwszym juz nie pamietam ponizej podam link do starego mojego tematu

problem z zapytaniem mysql

z gory dzieki za kazda pomoc
thek
Wszystko zależy od struktury tabel w bazie. Najprostszy, co nie znaczy od razu najlepszy, to posortować tabelę wyników najpierw po interesującej Cię informacji i pogrupować po innym kryterium. Tu jest właśnie problem, ponieważ ORDER BY jest wykonywane PO grupowaniu dopiero i nie można tej kolejności zamienić. Pomysłów na odejście tego problemu jest kilka. Najczęściej tworzysz podzapytanie, które ustawia rekordy we właściwym porządku i dopiero je grupujesz.
binbash
Może zrób tak, powinno działać:
  1. SELECT t1.id, t1.nazwa, t1.metrow, t1.rok FROM tabela t1
  2. WHERE t1.metrow=SELECT(MAX(t2.metrow) FROM tabela t2 WHERE t1.nazwa=t2.nazwa) ORDER BY t1.metrow DESC;

Tyle, że to podzapytanie jest skorelowane a zatem niezbyt wydajne.
-jymbox-
dzieki smile.gif dziala ladnie
thek
Jak wspomniał binbash... Jest to zapytanie skorelowane a więc niezbyt wydajne.
  1. SELECT t1.id, t1.nazwa, t1.metrow, t1.rok FROM tabela AS t1
  2. WHERE t1.metrow = ( SELECT MAX(t2.metrow) FROM tabela AS t2 WHERE t1.nazwa = t2.nazwa ) ORDER BY t1.metrow DESC;

vs moje na szybko napisane:
  1. SELECT * FROM ( SELECT * FROM tabela ORDER BY metrow DESC ) GROUP BY nazwa

binbash: 0.0016s
moje: 0.0009s

Problemem jest jednak co innego... Wielokrotne odwołania do obu zapytań (nieważne czy moja czy binbasha wersja) sprawią, że tak naprawdę różnica między nimi będzie niej ważna, gdyż kilkukrotne odwołanie sprawia, że oba schodzą z wynikami do około 0.0005-0.0007s i tutaj powinieneś poznać magiczny zwrot: cache'owanie wyników smile.gif
-jymbox-
neistety nie mam pojecia o co chodzi z tym cachowaniem wynikow cos tam czytam i poczytam dalej ale jak narazie nie kapuje zbytnio :/
thek
Chodzi o to, aby za każdym razem nie robić zapytania do bazy tylko skorzystać z systemu, który wynik przechowuje. Pomyśl... Jeśli coś zmienia się rzadko, to jest sens ciągle pytać o to samo, czy lepiej sobie zapisać to "na boku" i jedynie uaktualniać w przypadku gdyby coś się zmieniło? Tak działa właśnie cache. Samo cache'owanie potrafi mocno odciążyć bazę.
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.