Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL] Aktualizacja wszystkich rekordów w kolumnie
Forum PHP.pl > Forum > PHP
gausek90
Cześć wszystkim,

mam tabelę w bazie danych (przykładowa):

ID, Name, Order, Visible:
1, pierwszy, 1, 1
3, drugi, 4, 1
4, trzeci, 2, 1
7, czwarty, 8, 1
27, piąty, null, 0

Funkcjonalność polega na tym, że na stronie wyświetlane są informacje z rekordów w kolejności według kolumny "Order" od 1 do +~ jeżeli w kolumnie Visible jest wartość 1.

Jednak, w niektórych przypadkach np. usunięcia rekordu ze środka tabeli, powstaje luka (tak jak w przykładowej bazie) gdzie prawidłowa kolumna "Order" powinna zawierać wszystkie liczby od 1 do ~ czyli 1, 2, 3, 4, 5, itd., a nie 1, 3, 4, 8 itd. (brakuje 2, 5, 6, 7). Dodatkowa sprawa, że niektóre rekordy w kolumnie Order nie mają wartości (wartość null), ponieważ nie są widoczne na stronie.

Potrzebuje stworzyć zapytanie do bazy, które np. w przypadku usunięcia rekordu ze środka tabeli, zaktualizuje wartości w kolumnie Order od 1 do +~ dla wszystkich rekordów, które w kolumnie Order nie mają wartości null, i w obecnej kolejności według kolumny Order.

Próbowałem napisać takie zapytanie (nawet na razie pominąłem fakt, żeby ominąć rekordy z wartością null w kolumnie Order, i w kolejności według order) lecz nawet to nie udaje mi się.

Byłbym bardzo wdzięczny za pomoc.

EDIT. Ta funkcjonalność ma zastosowanie w systemie CMS, który sam piszę, dla ustawiania widoczności i kolejności wyświetlania podstron (zmiana kolejności podstron odbywa się poprzez zapytanie, które aktualizuje kolumnę Order o 1 w górę lub 1 w dół, (w zależności od kierunku) oba rekordy, które zapytanie dotyczy)
Greg0
Gdy usuwasz element z pozycją np. 3. To w następnym zapytaniu aktualizujesz wszystkie rekordy z pozycją >3, odejmując od pola order jedynkę.
W skrócie
  1. DELETE FROM test WHERE `order`=3;
  2. UPDATE test SET `order`=`order`-1 WHERE `order`>3;
Wazniak96
piszę od ręki i nie wiem czy zadziała. smile.gif

  1. $order = 5; //ostatnio skasowany rekord z wartością order = 5
  2. $sql = "UPDATE table SET order = order-'1' WHERE order > '$order'";
nospor
Cytat
piszę od ręki i nie wiem czy zadziała.
Nie zadziala.... order to nazwa zastrzezona i trzeba koniecznie brac ją `` gdy ktos mial fantazje i tak nazwal kolumne
Poza tym 1 to liczba a nie tekst wiec pisze sie 1 a nie '1'

@gausek90 wydaje mi się, iż poszedles troche w zlym kierunku. Powstanie luki nie powinno mieć zadnego znaczenia dla mechanizmu sortowania.
Rozumiem, ze masz blad dlatego, ze podczas zmiany miejsc zawsze przesuwasz o 1. I tu wydaje mi sie masz blad. Podczas zmiany miejsc powinienies zmieniac miejscami dwa sąsiadujace ze sobą elementy i nie zakladac na sztywno, ze roznica kolejnosci miedzy nimi wynosi 1. To tutaj powinienies poprawc mechanizm i nie zawracac sobie glowy lukami
gausek90
Dzięki wam za pomoc. Udało mi się napisać działający skrypt smile.gif

Pozdrawiam serdecznie
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.