Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL] Sortowanie danych
Forum PHP.pl > Forum > Przedszkole
harbii
Czy da się jakoś posortować wyciągnięte dane alfabetycznie ale tak aby nie brało pod uwagę czy to duża czy mała litera?

mam tak:
  1. <?php
  2. "SELECT * FROM table ORDER BY `nazwa` ASC ";
  3. ?>


i sortuje tak
Allegro
Books
Czytaj
Zegarki
e-Cyfrowe
eBay
inBook
Świat Książki

a powinno:
Allegro
Books
Czytaj
e-Cyfrowe
ebay
Świat Książki
Zegarki
nevt
jak są kodowane dane w tym polu? UTF8? jeżli tak, to spróbuj
  1. SELECT * FROM tabela ORDER BY pole COLLATE 'utf8_polish_ci';
mpps
prawdopodobny problem, to polskie litery (ś).

rozwiązania:
1. w tabeli dodaj pole np. 'lp', gdzie sam będziesz ustalał kolejność i sortuj po tym polu.
2. zamieniaj polskie znaki na ich odpowiedniki bez ogonków z wykorzystaniem ereg_replace lub str_replace i dopiero wtedy sortuj w zapytaniu.

pzdr
marcin
harbii
ok. ale mi nie chodzi o polskie znaki (to był tylko przykład)

chodzi o to że najpierw sortują sie wyrazy z wielkiej litery a potem z małej, a ja chciałbym aby sortowało sie bez względu na wielkość liter
mpps
strtolower i wtedy dopiero sortuj
harbii
a można jakimś zapytaniem zmienić wszystkie nazwy z tabeli nazwa na duże znaki? jakim?
mpps
strtoupper
piotrooo89
możesz zmieniać też pierwsze litery danych słow.

pierwsze na duże
pierwsze na małe
harbii
dobre

ale to tylko zmienia wyświetlanie a mi chodzi aby zmieniło samo się w bazie skoro nie da się posortować z różnymi literkami
piotrooo89
funkcja upper na duże i lower na małe...
mpps
'samo' w bazie się nie zmieni winksmiley.jpg
napisz sobie skrypt w PHP, który pobierze Ci dane z bazy, zamieni je wg potrzeb i zapisze spowrotem w bazie.
oczywiście jeśli ilość danych w bazie jest tego warta...
piotrooo89
masz manuala:

upper
lower
harbii
a jak poprawnie użyć strtoupper w
  1. <?php
  2. "SELECT * FROM table ORDER BY `nazwa` ASC ";
  3. ?>
?
żeby sortowało juz dużymi
piotrooo89
mysle że tak:

  1. <?php
  2. $sql = "SELECT UPPER(1 kolumna), UPPER(2 kolumna), UPPER(3 kolumna) FROM table ORDER BY nazwa ASC";
  3. ?>
ActivePlayer
chyba raczej tak:
  1. <?php
  2. "SELECT * FROM table ORDER BY UPPER(nazwa) ASC ";
  3. ?>
harbii
@ActivePlayer - dzięki pomogło
mpps
a dla mnie temat pozostaje...
po co obciążać serwer dodatkowym zadaniem?
piotrooo89
Cytat(mpps @ 19.05.2008, 01:33:28 ) *
a dla mnie temat pozostaje...
po co obciążać serwer dodatkowym zadaniem?


może po to aby uzyskać oczekiwany efekt?
mpps
Cytat(piotrooo89 @ 19.05.2008, 07:46:40 ) *
może po to aby uzyskać oczekiwany efekt?


nie do końca się uzyska zamierzony efekt, ponieważ dalej pozostanie sprawa polskich znaków diakrytycznych.
samo UPPER() posortuje, ale nazwy z polskimi znakami na początku będą na końcu, zamiast w szeregu zgodnie z (polskim) alfabetem...
nie sprawdzałem, ale mam wrażenie, że się nie mylę
nevt
oślepli chyba wszyscy w tej dyskusji. rozwiązanie stoi ja wół, podane na tacy w moim poprzednim poście - bezpośrednio pod pytaniem...

chociaż najwłaściwsze rozwiązanie, to ustawić dla tego pola w tabeli (np. przez phpMyAdmin) Column Charset: utf8, Column Collate: utf8_polish_ci. wtedy zwykły SELCET z ORDER BY zwróci odpowiednio poustawiane wiersze ... wystarczy również samo ustawienie Column Charset, bo Collate można już sobie zadawać bezpośrednio w SQL jak pokazałem wcześniej (ale jest to mniej wydajne rozwiązanie, jeżeli mamy na tym polu indeks...)

ABSOLUTNIE NIE MA POTRZEBY robienia jakichś dziwnych uników z UPPER() LOWER() czy innymi funkcjami. po to wprowadzono Charset UTF8 oraz Collation m.in. polish_ci (ci to znaczy case insensitive - bez względu na wielkość liter...) żeby można było poprawnie sortować dane w języku polskim (oraz wielu innych).

pozdrawiam i życzę powodzenia.
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.