Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Sortowanie tabeli mySQL
Forum PHP.pl > Forum > Bazy danych > MySQL
Black-Berry
Mam takie pytanie:

Mam tabelę mySQL a w niej np. 5 rzędów z wpisami

ID NAZWA KOLEJ
-----------------------
1. | rząd_1 | 1
2. | rząd_2 | 2
3. | rząd_3 | 3
4. | rząd_4 | 4
5. | rząd_5 | 5
---------------------- ( tabela #1 )

I teraz chcę wstawić nowy rząd pomiędzy rzad_2 i rząd_3. Wymyśliłem taki sposób, że na ustalam wartość kolejnośći nowego rzędu na średnią arytmetyczną rzędów pomiędzy. W tym wypadku kolejnośc = 2.5. Otrzymuje takie coś:

ID NAZWA KOLEJ
-----------------------
1. | rząd_1 | 1
2. | rząd_2 | 2
6. | rząd_N | 2.5
3. | rząd_3 | 3
4. | rząd_4 | 4
5. | rząd_5 | 5
---------------------- ( tabela #2 )

Ale żeby nie było późniejszych zawirowań sortuje tą tabelę tak aby KOLEJ nie zawierała zmiennoprzecinkowych liczb. Otrzymuję:

ID NAZWA KOLEJ
-----------------------
1. | rząd_1 | 1
2. | rząd_2 | 2
6. | rząd_N | 3
3. | rząd_3 | 4
4. | rząd_4 | 5
5. | rząd_5 | 6
---------------------- ( tabela #3 )

I wszystko wyglada pięknie ale sortowanie przeprowadzam za pomocą PHP co jest dość nieefektywne. Zna ktoś może sposób aby ( tabelę #2 ) posortowac do postaci ( tabeli #3 ) za pomocą zapytania SQL ?!
Darti
pseudo:
update tabela set kolej = kolej+1 where nazwa > insertowana_nazwa;
insert into tabela values (insertowana_nazwa, (select kolej from tabela where nazwa > insertowana_nazwa order by kolej limit 1) - 1)

Taki mały pomysł do przerobienia na działające zapytanie (trzeba jeszcze uwzględnić że nazwa to text i nie wiem jak kazać porównywać napisy bazie).
Black-Berry
Kurcze rzeczywście byłbym za tym żeby użyć do tego czegoś w stylu kolej = kolej + 1 ale nie może być tak jak piszesz bo nazwa nie koniecznie musi być zapisywaa w ten sposób. Moze tam być też moja_nazwa3 lub jakaś_nazwa_5. Moznaby zamiast nazwy wykożystać pole ID ale nie jestem do końca przekonany czy to zadziała. Fajnie jakby ktoś miał dotowy skrypt albo już wcześniej spotkał się z problemem.
Darti
Ale w jakiś sposób musisz określić między jakie wiersze wstawić ten nowy, w tym celu wcześniej pobierasz (przynajmniej jeden - poprzedni albo następny) jakiś wiersz, z którego już można wywnioskować resztę.
Dajmy na to że chcesz wstawić nowy wiersz pomiędzy 2 a 3 dotychczasowy, to:
update tabela set kolej = kolej+1 where kolej > 2;
insert into tabela values (null, nazwa, 2);

Znamienna jest tutaj ta dwójka, o której przecież wiesz wcześniej bo właśnie po niej ma być nowy wiersz.
Black-Berry
Testując to wynikł jeszcze jeden problem. Co jeśli chcę zamienić miejscami wpisy np 2 i 4 a nie dodać nowy. Nie moge wtedy użyć kolej=kolej+1 bo dostałbym takie coś:

1. dodaje 1 do kazdego wpisu począwszy od 2 i mam

1. k=1
2. k=3
3. k=4
4. k=5
5. k=6

2. zamieniam 4 na 2 i ostatecznie tabela wyglada tak:

1. k=1
4. k=2
2. k=3
3. k=4
5. k=6

3. Jak widać brakuje mi teraz 5. Musi byc przeciez jakiś sposób na sortowanie tabeli mySQL. ?!
Darti
Chcąc zamienić coś miejscami nie dodajesz wartości, przecież ilość wpisów pozostaje taka sama...
Żeby zamienić dwa wiersze miejscami trzeba zapamiętać do zmiennej wartość jednego wiersza, wstawić w to miejsce zawartość drugiego a potem wpisać wartość z pamięci do drugiego.

edit:
dla bezpieczeństwa stosuje się transakcje, ale nie pamiętam czy zwykłe MyISAM to obsługuje (chyba InnoDB trzeba używać do transakcji)
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.