![]() ![]() |
Post
#1
|
|
|
Grupa: Zarejestrowani Postów: 115 Pomógł: 0 Dołączył: 16.04.2005 Skąd: Białowieża Ostrzeżenie: (0%)
|
Witam.
Specyfikacja sytuacji: Elementy w moim systemie menu są sortowane według pola 'order' od zera w górę, w panelu administracyjnym jest opcja przesuwania ich w górę oraz i w dół. Oto funkcja, która służy mi do przykładowego przesunięcia danego elementu tablicy "w górę":
Specyfikacja rezultatu: Działa bez zarzutu. Specyfikacja problemu: Cholera, tutaj są aż cztery zapytania x) Pytanie: Ma ktoś pomysł, jak zamienić te order'y szybciej i za pomocą mniejszej liczby zapytań? |
|
|
|
Post
#2
|
|
|
Grupa: Nieautoryzowani Postów: 92 Pomógł: 15 Dołączył: 21.10.2006 Ostrzeżenie: (0%)
|
Witam.
Wykombinowałem kod przy pomocy ktorego robi sie to jednym zapytaniem. Nic nie psuje jesli np. wiersz juz jest na samej gorze a ty mimo wszystko bedziesz go chcial przesunac wyzej. Nic nie musisz sprawdzac. Przetestowyany i dziala ale ... tak niefortunnie wybrales pole 'order' slowo zarezerwowane ze trzeba je brac w cudzyslowia i trzeba robic dodatkowe aliasy. Dla mojej testowej tabeli (categories) kod wyglada nastepujaco.
Wszystkie wystapienia "6" musisz zastapic swoja zmienna $menuitemid (przyklad jest dla kategorii o id 6) categories -> ###menuitems categories_id -> id categories_order -> order Przerobka nie powinna sprawiac klopotow a tylko troche gimnastyki bo tak jak mowilem musisz wszystko apostrofowac (tzn nazwa tabeli i kolumna order) a przy moich nazwach nie trzeba pozdrawiam Ps. jesli mialbys problem z przerobka daj znac, pomoge jesli bys nei mogl odnalesc sie w tym kodzie to moge wytlumaczyc krok po kroku Ten post edytował heaven 11.11.2007, 09:23:46 |
|
|
|
Post
#3
|
|
|
Grupa: Zarejestrowani Postów: 115 Pomógł: 0 Dołączył: 16.04.2005 Skąd: Białowieża Ostrzeżenie: (0%)
|
Heaven, jesteś moim pozytywnym bożyszczem :*
W mojej wersji wygląda to w ten sposób:
I działa bez zarzutu. Dziękuję bardzo (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) . Jednak, jeśli miałbyś minimalne chęci, mógłbyś przynamniej pobieżnie wytłumaczyć, jakim mechanizmem to działa? Paru rzeczy nie mogę skojarzyć, a chcę się doskonalić :] Ten post edytował rolnix 11.11.2007, 15:13:02 |
|
|
|
Post
#4
|
|
|
Grupa: Nieautoryzowani Postów: 92 Pomógł: 15 Dołączył: 21.10.2006 Ostrzeżenie: (0%)
|
powiedzmy ze mamy tabele categories (przytocze ta moja wersje (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) a w niej wiersze
Kod categories_id | categories_order ---------------------------------- ... | ... 1 | 13 2 | 14 ... | ... chodzi nam o zamienienie przy tych dwoch wierszach wartosci kolumny categories_order mozna to zapisac tak:
czyli:
tworzy nam to tabele z 2 wierszami Kod categories_id | categories_order ---------------------------------- 1 | 14 *(1) 2 | 13 *(2) i nastepnie to wpada w update i dla categories_id = 1 jest ustawiane categories_order na 14 a dla categories_id = 2 categories_order ustawiane na 13 czyli mamy update 2 wierszy za pomoca jednego zapytania ale potrzebowalibysmy jeszcze jednego zapytania na pobranie danych do tego zapytania my chcemy zrobic zapytanie gdzie jedyna wiadoma jest id kategori ktora chcemy przesunac w gore o jeden czyli catgories_id='2' na poczatku utworzymy zapytanie ktore zwroci wiersz *(2) z powyzszej tabeli czyli id = 2 i order = 13
zaczynajac od zapytania najbardziej zagniezdzonego
to zwroci nam categories_order dla naszej przesowanej kategori id = 2 czyli 14 i to wstawiam do zapytania mniej zagniezdzonego
to znowy zwroci nam najwiesza wartosc categories_order mniejsza od 14 czyli 13 czyli ogolnie cale zapytanie wyglada mniejwiecej tak
no i to da wynik w postaci tabeli z jednym wierszem Kod categories_id | categories_order ---------------------------------- 2 | 13 polowe mamy teraz jeszcze wiesz z id = 1 i order = 14
a wiec zaczynajac od zapytania zagniezdzonego
to zwraca nam categories_order = 14 wiec zapytanie wyglada teraz tak
to zwroci nam categories_order dla naszej przesowanej kategori id = 2 czyli 14 (w sumie to nie potrzebenie bo bylo to zrobione w poprzednim zapytaniu i mozna to znalesc pod aliasem ord.categories_order wiec na koncu napisze krotsza wersje tego calego zapytania)
to cale zapytanie zwroci nam id wiersza ktory ma byc zamieniony z naszym wybranym wierszem czyli 1 i categories_order 14 Kod categories_id | categories_order ---------------------------------- 1 | 14 teraz te 2 selecty laczymy za pomoca union i wstawiamy do update i to wszystko (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) mam nadzieje ze te wypociny chociaz troche sa zrozumiale tak wiec wersja troszke krotsza
|
|
|
|
Post
#5
|
|
|
Grupa: Zarejestrowani Postów: 115 Pomógł: 0 Dołączył: 16.04.2005 Skąd: Białowieża Ostrzeżenie: (0%)
|
Jestem niezmiernie wdzięczny za wytłumaczenie... i pełen podziwu za to, że Ci się chciało (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
|
|
|
|
![]() ![]() |
|
Aktualny czas: 21.12.2025 - 17:04 |