Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][MySQL] Zmiana kolejności rekordów w bazie (up/down)
Majkelo23
post
Post #1





Grupa: Zarejestrowani
Postów: 226
Pomógł: 17
Dołączył: 13.02.2012

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


Czy wraz z nowymi update mysql, pojawiła się jakaś alternatywa dot. w miarę swobodnej zmiany kolejności wyświetlania pól w bazie?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 13)
Pyton_000
post
Post #2





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Eee?(IMG:style_emoticons/default/questionmark.gif)
Go to the top of the page
+Quote Post
Majkelo23
post
Post #3





Grupa: Zarejestrowani
Postów: 226
Pomógł: 17
Dołączył: 13.02.2012

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


Pytam po prostu czy istnieje jakiś sposób, aby w jedno zapytanie władować pozycje dwóch elementów i je między sobą zamienić, czy też trzeba odczytywać po kolei pozycje dwóch elementów, po czym ładować kolejne dwa zapytania updatujące te dwa rekordy o nowe pozycje (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
by_ikar
post
Post #4





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

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


Tobie chodzi o sortowanie wyników, czy jak ?
Go to the top of the page
+Quote Post
Majkelo23
post
Post #5





Grupa: Zarejestrowani
Postów: 226
Pomógł: 17
Dołączył: 13.02.2012

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


Mam tabelę w bazie o naziwe "moje_samochody":

Cytat
| ID | POSITION | NAME |
| 2 | 1 | Volvo |
| 7 | 2 | Porche |
| 22 | 3 | Punto |


I teraz jak zamienić miejscami Punto z Volvo, bazując na kolumnie position ? Czyli po prostu jak zmienić liczby 1 <--> 3 jak najmniejszą ilością zapytań?

Ten post edytował Majkelo23 7.09.2014, 13:15:15
Go to the top of the page
+Quote Post
by_ikar
post
Post #6





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

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


Poczytaj o ORDER BY, które istnieje w takim mysql'u od chyba samego początku (IMG:style_emoticons/default/wink.gif)

W twoim przypadku było by to:

  1. SELECT * FROM `moje_samochody` ORDER BY `position` ASC

wynik byłby od 1 do 3, lub:

  1. SELECT * FROM `moje_samochody` ORDER BY `position` DESC


wynik byłby od 3 do 1.

Ten post edytował by_ikar 7.09.2014, 15:32:31
Go to the top of the page
+Quote Post
mmmmmmm
post
Post #7





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


Cytat(Majkelo23 @ 7.09.2014, 14:14:32 ) *
Mam tabelę w bazie o naziwe "moje_samochody":



I teraz jak zamienić miejscami Punto z Volvo, bazując na kolumnie position ? Czyli po prostu jak zmienić liczby 1 <--> 3 jak najmniejszą ilością zapytań?

To jakiś challenge? Jednym zapytaniem...
  1. UPDATE samochody SET position =4-position WHERE position IN (1,3)


Ten post edytował mmmmmmm 7.09.2014, 20:04:28
Go to the top of the page
+Quote Post
Majkelo23
post
Post #8





Grupa: Zarejestrowani
Postów: 226
Pomógł: 17
Dołączył: 13.02.2012

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


Może po prostu przytoczę temat bo nie o to mi chodzi: http://www.forumweb.pl/php/zmiana-kolejnos...apytaniem,50611

Jest tam takie zapytanie:
Kod
UPDATE tabela
SET order = IF (order = $stary_order, $nowy_order, order + SIGN($stary_order - $nowy_order))
WHERE order >= LEAST($nowy_order, $stary_order) AND order <= GREATEST($nowy_order, $stary_order)


które niestety zwraca taki błąd:

Cytat
#1064 - Something is wrong in your syntax obok 'order = IF (order = 1, 2, order + SIGN(1 - 2)) WHERE order >= LEAST(2, 1) AND or' w linii 1


I nie wiem, w czym może być problem? Ew. jak to zastąpić czymś sensownym?
Go to the top of the page
+Quote Post
mmmmmmm
post
Post #9





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


Problem jest w tym, że ch...wo nazywasz pola.
Go to the top of the page
+Quote Post
Pyton_000
post
Post #10





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


`order`
Go to the top of the page
+Quote Post
Majkelo23
post
Post #11





Grupa: Zarejestrowani
Postów: 226
Pomógł: 17
Dołączył: 13.02.2012

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


OK, a powiedzcie mi jeszcze jedną rzecz - załóżmy, że dodaję do bazy nowy rekord za pomocą instrukcji INSERT INTO (...) - jak z automatu przypisać najwyższy order dla tego rekordu? Najpierw muszę wykonać dodatkowe zapytanie, wyciągające najwyższy order i potem mając ten wynik, dodaję +1 i wrzucam z tą wartością nowy rekord, czy da się to uwzględnić w jednym zapytaniu ? auto_increment chyba tutaj nie jest na miejscu, ponieważ zależy mi też na tym, aby dziur nie było pomiędzy rekordami, to dosyć ważne w tym wypadku.
Go to the top of the page
+Quote Post
Turson
post
Post #12





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

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


Jeżeli nie auto_increment, to tak jak napisałeś - pobrać max() i +1

Ten post edytował Turson 8.09.2014, 12:06:01
Go to the top of the page
+Quote Post
Majkelo23
post
Post #13





Grupa: Zarejestrowani
Postów: 226
Pomógł: 17
Dołączył: 13.02.2012

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


Coś z tym zapytaniem nadal jest nie tak. Co prawda błędu żadnego nie zwraca, ale źle zmienia te ordery.

Przed wykonaniem zapytania:

(IMG:http://s6.ifotos.pl/img/demo1png_easxpwe.png)

Zapytanie:

Kod
UPDATE tabela
SET position = IF (`position` = 4, 1, `position` + SIGN(4- 1))
WHERE position >= LEAST(1, 4) AND position<= GREATEST(1, 4)


Po wykonaniu zapytania:

(IMG:http://s6.ifotos.pl/mini/demo2png_easxpws.png)

Jak widać w zapytaniu, chciałem zamienić pozycję czwartą z pierwszą. I prawie się udało bo rekord 4-ty dostał pozycję 1-szą, ale już rekord 1-szy zamiast dostać pozycję 4-tą, dostał pozycję 2-gą. Gdzie leży błąd?

Ten post edytował Majkelo23 8.09.2014, 12:26:14
Go to the top of the page
+Quote Post
nospor
post
Post #14





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Dostales od mmmmmm poprawne zapytanie.... bez IFow.... czemu go nie uzyjesz? Jedno proste zapytanie, ktore rozwiązuje sprawę
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 22.08.2025 - 18:46