Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Problem z sortowaniem, Uzyskanie kolejności 9-1dan 1-30kyu
amwoan
post
Post #1





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 16.05.2005

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


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.


--------------------
Pozdrawiam.
BYKOM-STOP!
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 2)
Wave
post
Post #2





Grupa: Zarejestrowani
Postów: 332
Pomógł: 6
Dołączył: 13.01.2005

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


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.
Go to the top of the page
+Quote Post
amwoan
post
Post #3





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 16.05.2005

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


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.


--------------------
Pozdrawiam.
BYKOM-STOP!
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 Aktualny czas: 20.08.2025 - 09:14