Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Zmiana kolejności wyświetlanych rekordów
Forum PHP.pl > Forum > Przedszkole
perhydrol
Witam,

mam problem, może nie jest to trudne ale nie potrafię sobie wymyślić dobrego sposobu na rozwiązanie następującego problemu.

Posiadam bazę danych a w niej przykładową tabelę, wymyśloną na potrzeby przykładu:


  1. id_item | name_item | price_item | ....
  2.  
  3. 1 | Coś_1 | 20 | ....
  4. 2 | Coś_2 | 10 | ....
  5. 3 | Coś_3 | 40 | ....
  6. 4 | Coś_4 | 20 | ....
  7. 5 | Coś_5 | 30 | ....
  8.  


oczywiście na pole "id_item" autoincrement, z jasnych przyczyn nie chcę zmieniać wartości tego pola
więc wymyśliłem aby dodać dodatkowe pole w tabeli dzięki któremu będzie można zmieniać kolejność wyświetlania się poszczególnych rekordów pole np. "show_item" autoincrement (choć nie koniecznie)

  1. id_item | name_item | price_item | SHOW_ITEM | ....
  2.  
  3. 1 | Coś_1 | 20 | 1 | ....
  4. 2 | Coś_2 | 10 | 2 | ....
  5. 3 | Coś_3 | 40 | 3 | ....
  6. 4 | Coś_4 | 20 | 4 | ....
  7. 5 | Coś_5 | 30 | 5 | ....
  8.  


Rekordy z tej tabeli mają się domyślnie wyświetlać -ostatnio dodanych 6 (no chyba że zostanie zmieniona kolejność po przez modyfikację pola "show_item")
więc:
  1. SELECT * FROM "tabela_items" WHERE "show_item" <> 0 ORDER BY "show_item" DESC LIMIT 6

(w zapytaniu warunek WHERE "show_item" <> 0, ponieważ usuwanie wybranych rekordów odbywa się na zasadzie ustawienia pola "show_item" = 0)

czyli, zakładając ze tabela "tabela_items" posiada 30 rekordów (od Coś_1 do Coś_30) w chwili obecnej:

1. Coś_30
2. Coś_29
3. Coś_28
4. Coś_27
5. Coś_26
6. Coś_25

wszystko wydaje mi się proste gdy chcę zmienić kolejność wybranego rekordu i ustawić go na pierwszej pozycji (ostatnich 6-ciu dodanych), zwiększając po prostu pole "show_item" o +1 od największego.

Moje pytanie jak to rozwiązać jeśli chciał bym dokonać zmiany wybranych rekordów np. questionmark.gif questionmark.gif

z

1. Coś_30
2. Coś_29
3. Coś_28
4. Coś_27
5. Coś_26
6. Coś_25

na

1. Coś_30
2. Coś_20
3. Coś_28
4. Coś_27
5. Coś_14
6. Coś_25

(nie wiem czy to coś zmienia ale interesuje mnie zmiana kolejności 6-ciu wyświetlanych elementów, domyślnie 6-ciu ostatnio dodanych)
cojack
Ale to kolego jakąś kryterie musisz sobie ustalać na jakiej zasadzie i poczym chcesz to wybierać, ja nie mam pojęcia skąd i dlaczego wzięło Ci się te Coś_20 zamiast 29.
perhydrol
już mowie i oczywiście poprawie pierwszy post,

zakładając ze tabela "tabela_items" posiada 30 rekordów (od Coś_1 do Coś_30) w chwili obecnej, i chcemy zmienić kolejność rekordów
zgodnie z zapytaniem:
  1. SELECT * FROM "tabela_items" WHERE "show_item" <> 0 ORDER BY "show_item" DESC LIMIT 6


chce dokonac zmiany z

Coś_30
Coś_29
Coś_28
Coś_27
Coś_26
Coś_25



modyfikując pole "show_item" na przedstawiona poniżej kolejność

Coś_30
Coś_20
Coś_28
Coś_27
Coś_14
Coś_25
elmozaur
No i w czym problem questionmark.gif?
Na warunkach ktore zostaly przedstawione wystarczy pamietac aby show_item posiadaly odpowiednie wartosci.

Np. jesli jest jakis panel admina wprowadzajacy te produkty to mozna zrobic tak:
klikasz na edycje produktu baza dostaje pytanie
  1. SELECT * FROM "tabela_items" WHERE "show_item" <> 0 ORDER BY "show_item" DESC LIMIT 6


w odpowiedzi zwraca ci 6 produktow z ich id i wartosciami show_item.
Znajac juz ostatnie 6 wartosci show_item mozesz je wpisac do dowolnych produktow recznie dzieki czemu masz pewnosc ze tylko one sie wyswietla.
perhydrol
hmmm, w dalszym ciągu nie jest to rozwiązanie jakie mnie zadowala ponieważ:

posiadając przykładowo 30-rekordów w tabeli "tabela_items", prezentowane jest ostatnie 6 rekordów jakie zostało dodane, nazwijmy to NOWOŚCI (tak dla przykładu)
czyli:

Coś_30
Coś_29
Coś_28
Coś_27
Coś_26
Coś_25

(powiedzmy że w panelu posiadamy listę wszystkich produktów, i funkcję pozwalająca nam przypisać pozycję na której ma się znaleźć wybrany produkt)
wchodząc do panelu administratora, chcę dokonać zmiany aby (nazwijmy to produkt) Coś_25 znalazł się na pierwszej pozycji wyświetlanej
czyli:

Coś_25
Coś_30
Coś_29
Coś_28
Coś_27
Coś_26

(jak dla mnie prosta czynność ponieważ zmieniamy wartość rekordu Coś_25, pola "show_item" na maksymalną + 1 [wartość rekordu Coś_25, pola show_item = 25, zastępujemy wartością 31] ) OK

następnie,
co jednak w przypadku gdy chcemy wyciągnąć rekord powiedzmy Coś_9, i ustawić na trzecią pozycję wyświetlaną
czyli:

Coś_25
Coś_30
Coś_9
Coś_29
Coś_28
Coś_27

jaką wartość przypisać pola "show_item", rekordu Coś_9 questionmark.gif Co się stanie z wartosciami rekordów Coś_25, Coś_30 questionmark.gif

Nie wiem czy nie wprowadza was w błąd sposób jaki ja zaprezentowałem z tym wprowadzeniem pola "show_item", może należy to w inny sposób rozwiązać, tylko jaki.

==============================================================

kolejny problem jaki napotkałem, to w jaki sposób auto numerować rekord "show_item", gdy już istnieje rekord wykorzystujący "autoincrement" czyli "id_item"
czy aby przypisać w "show_item" sensowną wartość będąca czymś w rodzaju auto numeracji, to po dodaniu produktu, UPDATE rekordu i przypisanie takiej samej wartości "show_item" co "id_item" questionmark.gif
elmozaur
banalnie proste. rozwiazan jest chyba 100 np:
w adminie zrob zakladke o nazwie np top 6;
po wejsciu w ta zakladke pokazuje sie formularz i 6 list rozwijanych jedna pod druga;
listy te zawieraja spis wszystkich "produktow" np:

  1. <select name="numer_1"><option value="id_produktu">nazwa produktu</option>

i tak 6 razy

a na dole strony submit.

I teraz formularz ktory odbiera te dane bierze w kolejnosci ID produktu w bazie w kolumnie pozycji wstawia odpowiednio od 1-6 a w pozostalych '0';
Przy 30 czy 300 rekordach w bazie to szybka robota...
perhydrol
to naprawdę proste i myślę że w miarę skuteczne rozwiązanie, pomijając dwa przypadki:

1. Domyślnie ma się tworzyć automatycznie, lista ostatnio 6-ciu dodanych produktów, ALE z uwzględnieniem dokonanych przez nas zmian, a przykład jaki opisujesz wydaje mi się że będzie działał jedynie wtedy gdy za każdym razem ustawimy tą kolejność ręcznie, bądź pokażemy 6 pozycji ostatnio dodanych.
[ mam rację, czy też coś przeoczyłem ? ]

2. Wspominałem że gdy ustawimy wartość pola wybranego rekordu na "0", produkt będzie traktowany jako usunięty (choć z tym jestem sobie w stanie poradzić)

elmozaur
masz racje.

w takiej sytuacji albo automat albo recznie z listy. Bo nawet jak napiszesz funkcje ktora uklada recznie to dodanie nowego produktu uruchomi automat i "zniszczy" reczne ustawienia.

Tu chyba sam problem wybory jest zly bo albo cos robi sie z automatu albop recznie.
chyba ze ktos ma inny pomysl

no chyba ze zrobisz taka funkcje ze:
jesli wybierzesz jakis produkt z listy na pewnej pozycji to informacja o pozycji zostanie zapisana w dodatkowej kolumnie np "blok"
i przy listowaniu z bazy trzeba bedzie najpierw sprawdzic ile jest pozycji zablokowanych.

Nastepnie 6-liczba zablokowanych da ci ilosc ktora trzeba pobrac z bazy (np4)

wyciagasz z bazy 4 pozycje i wiesz ze np 1 jest zablokowana (bo recznie wybrales) wiec pierwszy wynik wskoczy na 2 pozycje i tak dalej...

to powinno zadzialac ale musisz dostawic 1 dodatkowa kolumne
perhydrol
Cytat(elmozaur @ 30.09.2009, 14:45:32 ) *
...
no chyba ze zrobisz taka funkcje ze:
jesli wybierzesz jakis produkt z listy na pewnej pozycji to informacja o pozycji zostanie zapisana w dodatkowej kolumnie np "blok"
i przy listowaniu z bazy trzeba bedzie najpierw sprawdzic ile jest pozycji zablokowanych.

Nastepnie 6-liczba zablokowanych da ci ilosc ktora trzeba pobrac z bazy (np4)

wyciagasz z bazy 4 pozycje i wiesz ze np 1 jest zablokowana (bo recznie wybrales) wiec pierwszy wynik wskoczy na 2 pozycje i tak dalej...

to powinno zadzialac ale musisz dostawic 1 dodatkowa kolumne


Czy ten sposób z dodatkową kolumną będzie działał po dodaniu nowego produktu, czy nowo dodany produkt trafi na pierwszą pozycję??
Pytam bo nie jestem pewien czy dobrze zrozumiałem, myślałem nad tym rozwiązaniem i wydaje mi się że aby zrealizować coś takiego będzie potrzebna na 100% druga kolumna.


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