Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL][PHP]Zmiana kolejności wyświetlanych rekordów
perhydrol
post
Post #1





Grupa: Zarejestrowani
Postów: 50
Pomógł: 0
Dołączył: 11.12.2006

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


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. (IMG:style_emoticons/default/questionmark.gif) (IMG:style_emoticons/default/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)

Ten post edytował perhydrol 30.09.2009, 10:12:05
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
cojack
post
Post #2





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

Ostrzeżenie: (20%)
X----


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





Grupa: Zarejestrowani
Postów: 50
Pomógł: 0
Dołączył: 11.12.2006

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


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

Ten post edytował perhydrol 30.09.2009, 10:24:46
Go to the top of the page
+Quote Post
elmozaur
post
Post #4





Grupa: Zarejestrowani
Postów: 518
Pomógł: 18
Dołączył: 21.07.2008

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


No i w czym problem (IMG:style_emoticons/default/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.

Ten post edytował elmozaur 30.09.2009, 10:47:05
Go to the top of the page
+Quote Post
perhydrol
post
Post #5





Grupa: Zarejestrowani
Postów: 50
Pomógł: 0
Dołączył: 11.12.2006

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


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 (IMG:style_emoticons/default/questionmark.gif) Co się stanie z wartosciami rekordów Coś_25, Coś_30 (IMG:style_emoticons/default/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" (IMG:style_emoticons/default/questionmark.gif)

Ten post edytował perhydrol 30.09.2009, 12:37:29
Go to the top of the page
+Quote Post
elmozaur
post
Post #6





Grupa: Zarejestrowani
Postów: 518
Pomógł: 18
Dołączył: 21.07.2008

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


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





Grupa: Zarejestrowani
Postów: 50
Pomógł: 0
Dołączył: 11.12.2006

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


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ć)

Go to the top of the page
+Quote Post
elmozaur
post
Post #8





Grupa: Zarejestrowani
Postów: 518
Pomógł: 18
Dołączył: 21.07.2008

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


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





Grupa: Zarejestrowani
Postów: 50
Pomógł: 0
Dołączył: 11.12.2006

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


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

Ten post edytował perhydrol 1.10.2009, 15:21:53
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: 24.12.2025 - 10:01