Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Sortowanie wyników "naturalne"
Forum PHP.pl > Forum > Bazy danych > MySQL
Brick
Mam tabelę z polem VARCHAR która zawiera rekordy:
50
50A
50B
60
80
100
100A
110

Gdy zrobię SORT BY pole to otrzymuję:
100
100A
110
50
50A
50B
itd

Czy da się posortować to w sposób "naturalny" dla człowieka, czyli od najmniejszego do największego?
W tablicach jest coś takiego, nazywa się natsort.
sowiq
Hmm... http://forum.php.pl/index.php?showtopic=7657
Brick
Ach, faktycznie jest, a nie mogłem znaleźć.
Dzięki, działa, czyli trzeba zrobić:
select * from tabela order by cast(pole AS UNSIGNED)

No i po jakimś czasie wracam do problemu i okazuje się że nie zawsze dobrze działa to rozwiązanie. Mianowicie przy takich wartościach:
ZR 1
ZR 2
ZR 3A
ZR 3B
ZR 5
ZR 10A
ZR 10B
ZR 10C
ZR 11
ZR 12
ZR 13
(podaję w takiej kolejności w jakiej powinny się wyświetlać)

Podany powyżej sposób czyli ORDER BY CAST(nazwa_pola AS UNSIGNED) zwraca:
ZR 1
ZR 10A
ZR 10B
ZR 10C
ZR 11
ZR 12
ZR 13
ZR 2
ZR 3A
ZR 3B
ZR 5

Tak samo NIE działa inne rozwiązanie: ORDER BY ORD(LPAD(`nazwa_pola`, 10, '0' ))
Podobnie rozwiązanie podane tutaj: codewalkers.com
nospor
no bo Twoje wartości na początku mają ZR. Nie mozesz tekstu zrzutowac na liczbe bo da ci 0.
Musisz zaczac rzutowanie od momentu gdy zaczynają się liczby
Brick
Dzięki za wskazówkę, po kilku próbach doszedłem do czegoś co w końcu działa
  1. SELECT * FROM tabela ORDER BY CAST(SUBSTRING(nazwa_pola,4,10) AS UNSIGNED), SUBSTRING(nazwa_pola,5,10) ASC


Ale niestety, nie jest to uniwersalny kod na wszystkie przypadki.
Szkoda że nie zrobili w MySQL takiej funkcji jak natsort bo często jest potrzebna, a chyba nie da się użyć jakieś uniwersalnej prostej metody.
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.