Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z sortowaniem po grupowaniu
Forum PHP.pl > Forum > Bazy danych > MySQL
phpion
Witam,
mam pewien problem. Mam tabelę, w której przechowuję wyniki użytkowników w danej grze. Struktura tabeli to:
Kod
id, user_id, game_id, wynik, data

Każdy gracz do każdej gry może mieć kilka rekordów.
Chciałbym teraz pobrać listę 10 najlepszych graczy sortując ich najpierw po zdobytych punktach malejąco, a następnie (i tu problem) po dacie uzyskania punktów rosnąco.
W wyniku mam takie zapytanie:
  1. SELECT
  2. a.user_id, MAX(a.wynik) AS score, b.username, b.user_email, b.lost_info, FROM_UNIXTIME(a.`data`)
  3. FROM ranking a
  4. LEFT JOIN phpbb_users b ON b.user_id=a.user_id
  5. WHERE a.game_id=33 AND b.user_active=1 AND a.active=1
  6. GROUP BY
  7. a.user_id
  8. ORDER BY score DESC,
  9. a.`data` ASC LIMIT 10
  10. ;

Problem jednak w tym, że nie wiem w jaki sposób wyciągnąć datę uzyskania danego wyniku (po której ma nastąpić sortowanie). Aktualnie wybierana jest data uzyskania pierwszego wyniku w ogóle danego użytkownika dla danej gry.

Może podam przykładowe dane wyjściowe:
http://images32.fotosik.pl/361/a764f8be52aab7f9.png
Proszę zwrócić uwagę na użytkowników, którzy zdobyli po 450 pkt oraz daty, jakie widnieją przy wynikach (są niepoprawne).
Dane zawarte w bazie dla tych dwóch użytkowników dla danej gry (posortowane po punktach i dacie) to:
http://images38.fotosik.pl/10/fa82770aa2b9abad.png
Widać wyraźnie, że w zapytaniu, o które mi chodzi brana jest pod uwagę pierwsza wpisana data, a nie ta, kiedy zostały zdobyte punkty.

Proszę o pomoc,
pion
Kicok
  1. SELECT *
  2. FROM( ##PODZAPYTANIE## ) t
  3. GROUP BY t.user_id


A w podzapytaniu wyciągasz dane z tabel sortując je po wyniku malejąco.


EDIT
Pisane z palca, nie mam teraz możliwości sprawdzenia czy to działa
phpion
Chciałem zrobić w podobny sposób wyciągając datę w podzapytaniu na podstawie id użytkownika oraz wybranej liczby punktów ale nie mogę użyć aliasu score w podzapytaniu. Również nie mogę użyć id wyniku, gdyż jest on (jak i data) pierwszy z brzegu.
Kicok
Ze swojego zapytania ( które masz w 1 poście ) wywal GROUP BY, LIMIT i zamień MAX( `wynik` ) na `wynik`. To jest teraz twoje ##PODZAPYTANIE##, które wykonuje wszystko oprócz grupowania, więc wstawiasz je do zapytania zewnętrznego tak jak pokazałem i powinieneś otrzymać pczekiwane wyniki.

Zauważ, że nie chodzi mi o: SELECT ( ##PODZAPYTANIE ## ) FROM tabela
tylko o: SELECT * FROM ( ##PODZAPYTANIE ## ) t
phpion
Działa świetnie! Dzięki serdeczne za pomoc smile.gif
guitar.gif

Finalnie mam takie zapytanie:
  1. SELECT *
  2. FROM (SELECT a.user_id, wynik, b.username, b.user_email, b.lost_info, a.`data`
  3. FROM ranking a
  4. LEFT JOIN phpbb_users b ON b.user_id=a.user_id
  5. WHERE a.game_id=33 AND b.user_active=1 AND a.active=1
  6. ORDER BY wynik DESC,
  7. a.`data`) t
  8. GROUP BY t.user_id
  9. ORDER BY t.wynik DESC, t.`data` ASC LIMIT 10 ;
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.