Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL] Zmiana kolejności rekordów w bazie (up/down)
Forum PHP.pl > Forum > Przedszkole
Majkelo23
Czy wraz z nowymi update mysql, pojawiła się jakaś alternatywa dot. w miarę swobodnej zmiany kolejności wyświetlania pól w bazie?
Pyton_000
Eee?questionmark.gif
Majkelo23
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 wink.gif
by_ikar
Tobie chodzi o sortowanie wyników, czy jak ?
Majkelo23
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ń?
by_ikar
Poczytaj o ORDER BY, które istnieje w takim mysql'u od chyba samego początku 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.
mmmmmmm
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)
Majkelo23
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?
mmmmmmm
Problem jest w tym, że ch...wo nazywasz pola.
Pyton_000
`order`
Majkelo23
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.
Turson
Jeżeli nie auto_increment, to tak jak napisałeś - pobrać max() i +1
Majkelo23
Coś z tym zapytaniem nadal jest nie tak. Co prawda błędu żadnego nie zwraca, ale źle zmienia te ordery.

Przed wykonaniem zapytania:



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:



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?
nospor
Dostales od mmmmmm poprawne zapytanie.... bez IFow.... czemu go nie uzyjesz? Jedno proste zapytanie, ktore rozwiązuje sprawę
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.