Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z sortowaniem
Forum PHP.pl > Forum > Bazy danych > MySQL
amwoan
Witam,

Mam pewną tabelę zawodników, która zawiera m. in. dwie kolumny określające siłę zawodnika: `sila_typ` i `sila_wart` oraz kolumnę określającą status: `status`.
Pole `sila_typ` może przyjmować wartości: 'dan' lub 'kyu', `sila_wart` to po prostu jakaś liczba, a `status` może być 'active', bądź 'inactive'.

Kolejność sił przedstawia się następująco (od najsilniejszego do najsłabszego):
9dan, 8dan, ... 1dan, 1kyu, 2kyu, ... 30 kyu.

I teraz mój problem:
Chciałbym wybrane rekordy z bazy posortować w następujący sposób:
- najpierw względem statusu (na początku 'active', później 'inactive' - to oczywiście banalne)
- następnie wg siły (od najsilniejszego do najsłabszego - i tu pojawia się problem, ponieważ kolejność wartości sił jest różna dla 'dan' i 'kyu')

Czy jest to w ogóle wykonalne przy pomocy jednego zapytania SQL (bez użycia unii)?

Z góry dziękuję za wszelkie sugestie.
Wave
Ja bym próbował przypisać przed watrości bazy numery okerslajace poziom. Np. 1.9dan, 2.8dan, 3.7dan, 4.6dan, 5.5dan, 6.4dan, 7.3dan, 8.2dan, 9.1dan, 10.1kyu, 11.2kyu itd...
Tak widzę najprostrze rozwązanie.
amwoan
Witam ponownie,

Rozważałem podobne rozwiązanie, ale po pierwsze wprowadzałoby ono niepotrzebną redundancję do bazy, po drugie wymuszałoby dodatkowe przetwarzanie danych przed samym dodaniem (obecnie jednak muszą one być przetwarzane zaraz po wyciągnięciu). Oczywiście jest to pewien zysk, gdyż częściej dane są pobierane, niż umieszczane w bazie (przynajmniej w tym konkretnym przypadku).
W zasadzie to już zaimplementowałem odpowiednie mechanizmy sortowania po odebraniu danych z bazy (w samej aplikacji - php), ale właśnie wymyśliłem pewien sposób (w sumie dość banalny chyba), aby zrobić to jednak w SQL'u. Tym samym, pomyślałem też, że się nim podzielę. winksmiley.jpg

Oto moje rozwiązanie:
  1. SELECT STATUS, sila_wart, sila_typ, IF(sila_typ='dan', -sila_wart, sila_wart) AS sila_sort
  2. FROM tour_reg ORDER BY STATUS ASC, sila_typ DESC, sila_sort ASC;

Cały trick polega na zmianie znaku sił danowców (lub graczy kyu, do wyboru), a pozostałych przepisaniu normalnie. Ustawiamy to jako nowe pole i po nim dokonujemy sortowania. Nie wiem na ile wpływa to na wydajność całego zapytania (moja tabela nie zawiera zbyt wielu rekordów), ale z pewnością działa.
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.