Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Przesuwanie rekordów w tabeli MySQL
dachu
post
Post #1





Grupa: Zarejestrowani
Postów: 70
Pomógł: 0
Dołączył: 30.08.2005

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Pawel_W
post
Post #2





Grupa: Zarejestrowani
Postów: 1 675
Pomógł: 286
Dołączył: 15.06.2009
Skąd: Wieliczka

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
skowron-line
post
Post #3





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

Ostrzeżenie: (0%)
-----


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


--------------------
I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy.

QueryBuilder, Mootools.net, bbcradio1::MistaJam
http://www.phpbench.com/
Go to the top of the page
+Quote Post
dachu
post
Post #4





Grupa: Zarejestrowani
Postów: 70
Pomógł: 0
Dołączył: 30.08.2005

Ostrzeżenie: (0%)
-----


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ę...

Ten post edytował dachu 3.08.2009, 11:00:42
Go to the top of the page
+Quote Post
skowron-line
post
Post #5





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

Ostrzeżenie: (0%)
-----


  1. SELECT id FROM tabela WHERE position = ( position - 1 )

W zasadzie to zle napisalem z tym ID


--------------------
I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy.

QueryBuilder, Mootools.net, bbcradio1::MistaJam
http://www.phpbench.com/
Go to the top of the page
+Quote Post
Pawel_W
post
Post #6





Grupa: Zarejestrowani
Postów: 1 675
Pomógł: 286
Dołączył: 15.06.2009
Skąd: Wieliczka

Ostrzeżenie: (0%)
-----


  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ś?

Ten post edytował Pawel_W 3.08.2009, 11:03:18
Go to the top of the page
+Quote Post
dachu
post
Post #7





Grupa: Zarejestrowani
Postów: 70
Pomógł: 0
Dołączył: 30.08.2005

Ostrzeżenie: (0%)
-----


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

Ten post edytował dachu 3.08.2009, 11:25:20
Go to the top of the page
+Quote Post
djlinux
post
Post #8





Grupa: Zarejestrowani
Postów: 12
Pomógł: 2
Dołączył: 4.07.2009
Skąd: Zamość

Ostrzeżenie: (0%)
-----


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. ?>
Go to the top of the page
+Quote Post
dachu
post
Post #9





Grupa: Zarejestrowani
Postów: 70
Pomógł: 0
Dołączył: 30.08.2005

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 05:56