![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 663 Pomógł: 6 Dołączył: 3.06.2007 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
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 ?! -------------------- http://www.berry.nazwa.pl/edico/public_html/index.php ----> under construction
|
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 1 076 Pomógł: 62 Dołączył: 6.03.2005 Skąd: Wroc Ostrzeżenie: (0%) ![]() ![]() |
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). Ten post edytował Darti 4.06.2007, 17:33:27 -------------------- The answer is out there, Neo. It's looking for you. And it will find you, if you want it to.
SERVER_SOFTWARE : Apache/2.2.4 (Win32) PHP/5.2.1 MySQL Client API version : 5.0.27 |
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 663 Pomógł: 6 Dołączył: 3.06.2007 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
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.
-------------------- http://www.berry.nazwa.pl/edico/public_html/index.php ----> under construction
|
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 1 076 Pomógł: 62 Dołączył: 6.03.2005 Skąd: Wroc Ostrzeżenie: (0%) ![]() ![]() |
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. -------------------- The answer is out there, Neo. It's looking for you. And it will find you, if you want it to.
SERVER_SOFTWARE : Apache/2.2.4 (Win32) PHP/5.2.1 MySQL Client API version : 5.0.27 |
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 663 Pomógł: 6 Dołączył: 3.06.2007 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
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. ?! Ten post edytował Black-Berry 8.06.2007, 01:14:43 -------------------- http://www.berry.nazwa.pl/edico/public_html/index.php ----> under construction
|
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 1 076 Pomógł: 62 Dołączył: 6.03.2005 Skąd: Wroc Ostrzeżenie: (0%) ![]() ![]() |
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) Ten post edytował Darti 8.06.2007, 01:30:13 -------------------- The answer is out there, Neo. It's looking for you. And it will find you, if you want it to.
SERVER_SOFTWARE : Apache/2.2.4 (Win32) PHP/5.2.1 MySQL Client API version : 5.0.27 |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 19.06.2025 - 21:58 |