Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [SQL][PHP]Lista segregowana
kamilos809
post
Post #1





Grupa: Zarejestrowani
Postów: 165
Pomógł: 3
Dołączył: 2.04.2010

Ostrzeżenie: (10%)
X----


Hejka!
Może to głupie pytanie(dlatego przedszkole)... Dlaczego jak dam DESC to lista niby się segreguje, ale dajmy na to mam
100
200
150
0
30
to one zamiast ułożyć sie malejąco
200,150,100,30,0
to ustawiają się
30,200,150,100,0
Wie może ktoś dlaczego jest tak a nie inaczej? i co ważniejsze... jak temu zaradzić?
Go to the top of the page
+Quote Post
Pawel_W
post
Post #2





Grupa: Zarejestrowani
Postów: 1 675
Pomógł: 286
Dołączył: 15.06.2009
Skąd: Wieliczka

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


typ pola jest na pewno numeryczny? (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
kamilos809
post
Post #3





Grupa: Zarejestrowani
Postów: 165
Pomógł: 3
Dołączył: 2.04.2010

Ostrzeżenie: (10%)
X----


hmm... wszystkie rekordy są numeryczne, a pole jest varchar bodajże.
Go to the top of the page
+Quote Post
Pawel_W
post
Post #4





Grupa: Zarejestrowani
Postów: 1 675
Pomógł: 286
Dołączył: 15.06.2009
Skąd: Wieliczka

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


no więc właśnie (IMG:style_emoticons/default/smile.gif) skoro dajesz do zrozumienia bazie danych, że wynik jest typu varchar, to nie dziw się, że sortuje rekordy jak zwykły tekst (IMG:style_emoticons/default/smile.gif) zmień typ na jakiś liczbowy, odpowiedni dla danych
Go to the top of the page
+Quote Post
Case
post
Post #5





Grupa: Zarejestrowani
Postów: 1
Pomógł: 0
Dołączył: 30.08.2012

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


Stringi (varchar) są sortowane na podstawie kolejnych znaków.

Podałeś zestaw:
100
200
150
0
30

Sortowanie podanych przez Ciebie stringów (to istotne, że to nie liczby) przebiega więc następująco:
- bierzemy pierwszy znak każdego ze stringu, dostaniemy:
100
200
150
0
30
- ustawiamy je w kolejności malejącej (tak jak chciałeś w przykładzie):
30
200
100
150
0
- tam gdzie pierwszy znak jest taki sam, bierzemy do porównania drugi znak, czyli:
30
200
100
150
0
- piątka jest większa od zera, zamieniamy dwa ciągi znaków miejscami i kończymy, dając w wyniku
30
200
150
100
0

Gdyby były to liczby, a nie ciągi znaków sortowanie zadziałałoby tak jak się tego spodziewałeś.
To czego tutaj potrzebujesz to tzw. sortowanie naturalne, które napotykając na liczbę bierze ją całą pod uwagę, a nie tylko kolejny jej znak.
Niestety, mogę się mylić, ale z tego co się orientuję MySQL nie ma sortowania naturalnego.

Co możesz zrobić... jeśli przechowujesz w kolumnie tylko liczby, to zamień ją koniecznie na typ liczbowy. Nie dość, że sortowanie działa, nie dość, że szybciej, to jeszcze takie liczby mniej miejsca zajmują.
Go to the top of the page
+Quote Post
kamilos809
post
Post #6





Grupa: Zarejestrowani
Postów: 165
Pomógł: 3
Dołączył: 2.04.2010

Ostrzeżenie: (10%)
X----


może to głupie pytanie, ale typ liczbowy, to było INT? czy coś w ten deseń? bo szczerze żadko tego używam...
Go to the top of the page
+Quote Post
Szymciosek
post
Post #7





Grupa: Zarejestrowani
Postów: 1 168
Pomógł: 126
Dołączył: 5.02.2010
Skąd: Świdnica

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


Tak
INT - integer
Go to the top of the page
+Quote Post
kamilos809
post
Post #8





Grupa: Zarejestrowani
Postów: 165
Pomógł: 3
Dołączył: 2.04.2010

Ostrzeżenie: (10%)
X----


Dzięki bardzo (IMG:style_emoticons/default/biggrin.gif)
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: 23.08.2025 - 05:24