Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Sortowanie wg wlasnego klucza
Forum PHP.pl > Forum > Bazy danych > MySQL
jach
Witam

Czy istnieje mozliwosci sortowania w MySQL wg zdefiniowanego przeze mnie klucza ? Np mam w tabeli piec wierszy w tabeli o kolejnych ID -> 1,2,3,4,5 i chcialbym sobie posortowac wg mojego klucza np
Kod
Select id ..... order by klucz '2,3,4', id desc
aby otrzymac ID w kolejnosci 2,3,4,1,5. Ewentualnie sortowac text wg mojego wzorca a nie tylko alfabetycznie/odwrotnie alfabetycznie

Nie moge sie doszukac w manualu ;( - z gory dziekuje za pomoc
wozniak
Kod
ORDER BY klucz
i bedzie wyswietlac
z pola np. klucz alfabetycznie tzn.
1
2
3...
A
B
C..
jach
Rozumie iz musze sobie klucz istawic jako pole tabeli i wypelnic je odpowiednimi wartosciami - nie ma mozliwosci zdefiniwania takiego klucza recznie questionmark.gif

dzieki za info
wozniak
tak; np:
ORDER BY sort
id|nazwa|sort|
2|abc|1
4|bcd|2
1|ssd|3
3|we|4
intol
wozniak
...mógłbyć przedstawić jakiś przykład? Bo trudno mi zrozumieć twój post...

Z góry dzięki.
spenalzo
A jak zachowa sie zapytanie:
  1. SELECT *
  2. FROM tabela
  3. WHERE ID IN (2,6,9,1,3,5)

czyli bez podawania order by, a za to z wymuszeniem sprawdzenia id? Nie mam teraz możliwości tego sprawdzić.
nospor
no niestety spenalzo, ale to nic nie da. To jest określenie tylko warunku, a nie kolejności
spenalzo
Jeżeli BARDZO ci zależy na takim sortowanie to zostaje wyjście takie:
  1. SELECT *, CASE pole
  2. WHEN '6' THEN 1
  3. WHEN '12' THEN 2
  4. WHEN '7' THEN 3
  5. WHEN '1' THEN 4
  6. WHEN '2' THEN 5
  7. ELSE NULL
  8. END AS sortowanie
  9. FROM tabela
  10. ORDER BY sortowanie
TomASS
tutaj chciałem osiągnąć coś takiego jak Ty. Jedynym wyjściem wydaje się być rozwiązanie zaproponowane przez kolege spenelazo lub utworzenie osobnego pola np.o nazwie kolejność i wg. niego sortowanie, chyba, że wrzucisz to wszystko do php i będziesz sortował tablice, jednak MySQL prawdopodobnie zrobi to szybciej smile.gif Jak coś znajdziesz to pisz....
intol
Ja szukając w google natrafiłem na coś takiego:

Cytat
A common question on the mailing lists is how to sort results in a particular order. Just use the FIELD function:

SELECT * FROM tickets
ORDER BY FIELD(priority, 'High', 'Normal', 'Low', 'The Abyss');


link: http://dev.mysql.com/doc/refman/5.0/en/sorting-rows.html .

Tylko mam jakieś problemy z funkcją FIELD (nie rozpoznaje funkcji), może to dlatgo że pracuję na SQLite.
nospor
@intol mi ta funkcja dziala, a mam mysql 4.1

na tej stronce tez byl inny kod:
  1. SELECT *
  2. FROM tablename ORDER BY priority='High' DESC, priority='Medium' DESC, priority='Low' DESC;
Też dziala smile.gif
SongoQ
Ten temat sie juz przez forum przewijal. Oczywiscie najlepszym dla wydajnosci jest podanie wartosci w ORDER BY dla sortowania. Dla pewnosci polecam uzyc explain
TomASS
SongoQ proszę Cię abyś rozwiną swoją myśl. Jeśli to już było to proszę Cię abyś zapodał linka smile.gif Dzięki !
jach
Podsumowuja temat przynajmniej dla mnie smile.gif

okreslona kolejnosc id (INT) otrzymamy po operacji
Kod
SELECT id FROM tabela ORDER BY id = ( 2 +0 ) DESC , id = ( 3 +0 ) DESC , id = ( 4 +0 ) DESC , id = ( 1 +0 ) DESC


operacja (1 + 0 ) - to rzutowanie do INT znacznie przyspieszajace operacje SELECT (oczywiscie uzalezniam to od rodzaju pola ID)
spenalzo
Jak podajesz:
id=2 to jest int
id='2' to jest string
wiec teoretycznie nie musisz robic +0.
intol
Moim zdaniem rozwiązanie
Kod
WHEN '6' THEN 1
WHEN '12' THEN 2
WHEN '7' THEN 3
WHEN '1' THEN 4
WHEN '2' THEN 5
ELSE NULL

jest jednak szybsze niz to 2 posty wyzej (sprawdzamy - w optymistycznym wariancie - tylko raz, a nie cztery razy).
spenalzo
Różnice bedą tak minimalne, że pewnie niezauważalne...
SongoQ
@TomASS Oczywiscie chodzilo mi o sposob ktory podal @jach - troszeczke mozna to uproscic.

@spenalzo
Cytat
Różnice bedą tak minimalne, że pewnie niezauważalne...

Wladuj do DB kilka milionow rekordow i na pewno zobaczysz roznice. biggrin.gif
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.