Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Sortowanie wyników "naturalne"
Brick
post
Post #1





Grupa: Zarejestrowani
Postów: 107
Pomógł: 9
Dołączył: 16.02.2004
Skąd: Kraków

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


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





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

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


Hmm... http://forum.php.pl/index.php?showtopic=7657
Go to the top of the page
+Quote Post
Brick
post
Post #3





Grupa: Zarejestrowani
Postów: 107
Pomógł: 9
Dołączył: 16.02.2004
Skąd: Kraków

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


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
Go to the top of the page
+Quote Post
nospor
post
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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
Go to the top of the page
+Quote Post
Brick
post
Post #5





Grupa: Zarejestrowani
Postów: 107
Pomógł: 9
Dołączył: 16.02.2004
Skąd: Kraków

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


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

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 15.09.2025 - 02:23