Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL]Jak z danych tabeli zrobic ranking
--jymbox--
post 15.03.2011, 08:58:02
Post #1





Goście







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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
thek
post 15.03.2011, 09:28:09
Post #2





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
binbash
post 15.03.2011, 09:39:55
Post #3





Grupa: Zarejestrowani
Postów: 22
Pomógł: 8
Dołączył: 28.12.2010
Skąd: Szczecin

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


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.

Ten post edytował binbash 15.03.2011, 09:41:03
Go to the top of the page
+Quote Post
--jymbox--
post 15.03.2011, 10:15:52
Post #4





Goście







dzieki smile.gif dziala ladnie
Go to the top of the page
+Quote Post
thek
post 15.03.2011, 10:57:13
Post #5





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
--jymbox--
post 15.03.2011, 12:27:22
Post #6





Goście







neistety nie mam pojecia o co chodzi z tym cachowaniem wynikow cos tam czytam i poczytam dalej ale jak narazie nie kapuje zbytnio :/
Go to the top of the page
+Quote Post
thek
post 15.03.2011, 12:46:55
Post #7





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
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: 14.08.2025 - 03:31