Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Przesuwanie rekordów w tabeli MySQL
Forum PHP.pl > Forum > PHP
dachu
hey
moje pytanie będzie doyczyło wierszy w tabeli MYSQL.

mam np. tabele:

wiersz 1
wiersz 2
wiersz 3
wiersz 4

Czy można np: zamienić miejscami: wiersz 4 na pozycje wiersza 2 - ale tak żeby wiersz 2 pzostał i nie został usunięty?
Czy istnieje w MYSQl lub PHP jakieś zapytanie przestawiające wiersze tabeli?

Generalnie chodzi mi o to, że wyświetlam sobie kolejno rekordy w PHP i przy każdym wierszu chce zrobić przycisk przesuń "w dół" , "do góry".
Jak to zrobić? prosze o pomoc.

(ps. mam coś takiego że zamiast przycisków przesuń, mam pole input gdzie podaje ręcznie nr np: 1 i pod wszystkimi rekordami mam przycisk zapisz, który w komórce "kolejnosc" tabeli zapisuje nr wierszy a potem ORDER by kolejnosc ASC.
I działa ładnie, tylko chciałbym to jednak zamienić na przyciski, wiadomo rekordów może być setka i ręczne klepanie numerów nie jest zbyt dobrym rozwiązaniem.

dzięki, pozdrawiam.
Pawel_W
tu masz taki temat:
http://forum.php.pl/index.php?showtopic=126670&hl=

ale żeby nie było offtop czy coś w tym stylu winksmiley.jpg

musisz zrobić kolumnę id wg którek wyświetlasz, a potem zamieniasz id, a kolejnym zwiększasz lub zmiejaszasz o 1
skowron-line
podaj sobie dodatkową kolumnę np. position gdzie bedziesz przechowywał pozycję rekordu
i przy przesuwaniu w dol
  1. UPDATE tabela SET position= ( position+ 1) WHERE id = 2;

  1. UPDATE tabela SET position = ( position -1 ) WHERE id =3;

zamieniasz miejscami wiadomo.

p.s chyba sie zakrecilem w tym przykladzie questionmark.gif
dachu
Cytat(skowron-line @ 3.08.2009, 09:45:51 ) *
podaj sobie dodatkową kolumnę np. position gdzie bedziesz przechowywał pozycję rekordu
i przy przesuwaniu w dol
  1. UPDATE tabela SET position= ( position+ 1) WHERE id = 2;

  1. UPDATE tabela SET position = ( position -1 ) WHERE id =3;

zamieniasz miejscami wiadomo.

p.s chyba sie zakrecilem w tym przykladzie questionmark.gif


tak tylko w jaki sposób pozyskać ID poprzedniego / kolejnego rekordu? Np przesuwam 23 rekord w górę, czyli muszę mieć id 22 -ego rekordu aby nadpisać jego pozycję...
skowron-line
  1. SELECT id FROM tabela WHERE position = ( position - 1 )

W zasadzie to zle napisalem z tym ID
Pawel_W
  1. SELECT * FROM tabela WHERE id_rekordu < 23 LIMIT 1 ORDER BY id_rekordy DESC

mogłem się pomylic z tym desc

prymitywne, ale proste winksmiley.jpg

EDIT:
@up
to zadziała mu tylko jak będzie miał po kolei, a co jak usunie jakiś?
dachu
Cytat(Pawel_W @ 3.08.2009, 10:02:43 ) *
  1. SELECT * FROM tabela WHERE id_rekordu < 23 LIMIT 1 ORDER BY id_rekordy DESC

mogłem się pomylic z tym desc

prymitywne, ale proste winksmiley.jpg

EDIT:
@up
to zadziała mu tylko jak będzie miał po kolei, a co jak usunie jakiś?


hmmm to zapytanie nie działa... mam coś takiego:

  1. <?php
  2. $sql1="SELECT * FROM menu WHERE id < '$idm' ORDER BY id DESC LIMIT 1";
  3. ?>


...a bo id jest nie pokolei, ...
zadanie wydaje się proste smile.gif jednak jest z tym problem... nie ma ktoś jakiegoś przykładu?

a mam coś takiego z innego forum:

W tabeli kolumna kolejność względem której sortujesz, a do zamiany zapytanie: Kod:

  1. <?php
  2. UPDATE tabela SET kolejnosc = kolejnosc + CASE
  3.  WHEN id = XX THEN 1
  4.  WHEN id = YY THEN - 1
  5.  ELSE 0
  6. ?>


I tak:
1) Powinieneś zablokować możliwość przesuwania do góry pierwszego i na dól ostatniego elmentu
2) To jest przykład na "do góry". Dla "na dół" wystarczy 1 i - 1 zamienić miejscami
3) XX to ID rekordu przesuwanego, YY to ID rekordu, który również zostanie przesunięty

... ale nie kumam tego, bo to mi znowu nic nie daje, bo musze mieć id poprzedniego / następnego rekordu , tak to bym już to dawno zrobił smile.gif
ma ktoś jeszcze jakiś pomysł? generalnie rozchodzi się tylko o to id XX, YY
djlinux
Zamiana sąsiadujących pól sequence, przeanalizuj:
  1. <?php
  2. $query = "SELECT id FROM tabela WHERE `sequence` = '$fSequence'"; // pobiera ID z wskazanym sequence
  3.            $result = mysqli_query ($link, $query);
  4.            while ($row = mysqli_fetch_array ($result))
  5.                $id_high=$row[id];
  6.  
  7.            $query = "SELECT id, sequence FROM tabela WHERE sequence < '$fSequence' ORDER BY sequence DESC LIMIT 1"; // pobiera ID z sequencem niżej
  8.            $result = mysqli_query ($link, $query);
  9.            while ($row = mysqli_fetch_array ($result))
  10.            {
  11.                $id_low = $row[id];
  12.                $fSequencePrev = $row[sequence];
  13.            }
  14.            $query  = "UPDATE tabela SET sequence='$fSequence' WHERE id='$id_low'"; // zamiana pola sequence dla danego id
  15.            $result = mysqli_query ($link, $query);
  16.            $query  = "UPDATE tabela SET sequence='$fSequencePrev' WHERE id='$id_high'"; // zamiana pola sequence dla danego id
  17.            $result = mysqli_query ($link, $query);
  18.        }
  19. ?>
dachu
Cytat(djlinux @ 3.08.2009, 10:58:29 ) *
Zamiana sąsiadujących pól sequence, przeanalizuj:
  1. <?php
  2. $query = "SELECT id FROM tabela WHERE `sequence` = '$fSequence'"; // pobiera ID z wskazanym sequence
  3.            $result = mysqli_query ($link, $query);
  4.            while ($row = mysqli_fetch_array ($result))
  5.                $id_high=$row[id];
  6.  
  7.            $query = "SELECT id, sequence FROM tabela WHERE sequence < '$fSequence' ORDER BY sequence DESC LIMIT 1"; // pobiera ID z sequencem niżej
  8.            $result = mysqli_query ($link, $query);
  9.            while ($row = mysqli_fetch_array ($result))
  10.            {
  11.                $id_low = $row[id];
  12.                $fSequencePrev = $row[sequence];
  13.            }
  14.            $query  = "UPDATE tabela SET sequence='$fSequence' WHERE id='$id_low'"; // zamiana pola sequence dla danego id
  15.            $result = mysqli_query ($link, $query);
  16.            $query  = "UPDATE tabela SET sequence='$fSequencePrev' WHERE id='$id_high'"; // zamiana pola sequence dla danego id
  17.            $result = mysqli_query ($link, $query);
  18.        }
  19. ?>


dzięki, działa jak nalezy smile.gif
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.