Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> << poprzedni | nastepny >>
Dex1987
post 16.12.2005, 23:15:23
Post #1





Grupa: Zarejestrowani
Postów: 246
Pomógł: 0
Dołączył: 28.09.2004

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


Witam,

jest moza taka funkcja ktora zwraca nastepny i poprzednij rekord z bazy przy zapytaniu w WHERE id='id'

np. mam rekordy 2 4 7 9 gdzie jest wyswietlany obrazek o id 4 i przy nacisnieciu nastepny >> pokazuje mi obrazek o id 7 (nie 5) no i oczywiscie analogicznie dla << poprzedni.

Z gory dzieki, pozdrawiam dex.
Go to the top of the page
+Quote Post
nospor
post 17.12.2005, 12:16:53
Post #2





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




funkcji jako takiej nie ma. ale jestsposób smile.gif

next:
  1. SELECT id
  2. FROM tabela WHERE id>aktualneid ORDER BY id ASC LIMIT 1


prev:
  1. SELECT id
  2. FROM tabela WHERE id<aktualneid ORDER BY id DESC LIMIT 1


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
matias
post 18.01.2006, 00:14:35
Post #3





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 3.10.2004

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


Opisany tutaj problem oraz rozwiązanie to pestka. Problemy zaczynają się jeśli baza jest większa oraz dane posortujemy w taki sposób że ID nie będą ułożone rosnąco lub malejąco.

PRZYKŁAD:
Mamy bazę ogłoszeń samochodowych gdzie każdy może dodać ogłoszenie sprzedaży samochodu. Rekordów w bazie może być nawet kilkanaście tysięcy. User przegląda ogłoszenia np. jednej marki i dodatkowo sortuje je sobie wg. daty produkcji samochodu. Powiedzmy, że wyswietliło się mu 50 pozycji posortowanych wg. daty produkcji. Klika sobie i otwiera się mu strona ze szczegółami ogłoszenia na podstawie id w URL'u. Jak teraz zrobić cofnięcie o 1 ogłoszenie do przodu i do tyłu. Zaznaczam że w tak posortowanej liscie ogłoszeń id są pomieszane a data produkcji też może być dla kilkunastu ogłoszeń taka sama.

Ja dotychczas robiłem w ten sposób, że pobierałem wszystkie id z zapytania i wstawiałem do tablicy w php. Później szukałem id wyswietlonego ogłoszenia w tej tablicy i pobierałem element poprzedzający i następny. Jednak przy zapytaniach zwracających po kilkaset rekordów jest to bardzo nieefektywne i obciąża mocno serwer oraz wydłuża znacznie czas ładowania strony.
Go to the top of the page
+Quote Post
Vogel
post 18.01.2006, 00:31:19
Post #4





Grupa: Zarejestrowani
Postów: 402
Pomógł: 0
Dołączył: 20.01.2003

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


o bosz... tablice i php ?! wystarczy zwyczajny SQL! slyszales o LIMIT ?


--------------------
Go to the top of the page
+Quote Post
matias
post 18.01.2006, 00:39:39
Post #5





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 3.10.2004

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


Jasne że słyszałem. Nie wiem tylko czy zostałem zrozumiany dobrze.

Wyswietlam listę ogłoszeń
SELECT * FROM ogloszenia WHERE idmarka=10 ORDER BY rocznik

Dostaję powiedzmy 50 rekordów. Roczniki często się powtarzają. Teraz user klikan jedno ogłoszenie i na następnej stronie widzi już szczegóły ogłoszenia.

SELECT * FROM ogloszenia WHERE id=9658
Ja chcę teraz wiedzieć jakie id ma ogłoszenie następne i poprzedzające to wyswietlone wg. wyników z tego pierwszego zapytania.
Go to the top of the page
+Quote Post
SongoQ
post 18.01.2006, 00:54:25
Post #6





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

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


Nie wiem czy w MySQL jest cos takiego jak numerowanie rekordow, ale na 90% powinno byc, wtedy numerujesz i stosujesz metode ktora podal @nospor.


--------------------
Go to the top of the page
+Quote Post
matias
post 18.01.2006, 01:01:51
Post #7





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 3.10.2004

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


No właśnie już szukałem coś na ten temat pownieaż to by rozwiązało mój problem ale nigdzie nie znalałem nic na ten temat. Czy jest ktoś, kto wie czy w MySQL'u jest możliwość numerowania rekordów i ew. jak się to robi ?
Go to the top of the page
+Quote Post
Vogel
post 18.01.2006, 14:19:24
Post #8





Grupa: Zarejestrowani
Postów: 402
Pomógł: 0
Dołączył: 20.01.2003

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


Cytat(matias @ 2006-01-18 01:39:39)
SELECT * FROM ogloszenia WHERE idmarka=10 ORDER BY rocznik

SELECT * FROM ogloszenia WHERE id=9658

ups. wrong. podrzuce za momencik...

edit2:
a blad byl taki jak ktos ciekawy:
  1. SELECT *
  2. FROM ogloszenia WHERE idmarka=10 AND id>9658 ORDER BY rocznik


Ten post edytował Vogel 18.01.2006, 14:24:50


--------------------
Go to the top of the page
+Quote Post
nospor
post 18.01.2006, 14:22:16
Post #9





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




@Vogel
1) zjadles limit. teraz twoje zapytanie zwroci x rekordów
2) nie doczytales informacji. id nie są ulożonę w porządku rosnącym (następny rekord wcale nie musi miec wiekszego id)


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
SongoQ
post 18.01.2006, 14:31:57
Post #10





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

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


Dokladnie chodzi o to ze jak wyciagasz rekordy to maja byc nadawane numery poszczegolnym rekordom. NIe chce mi sie przewalac manuala MySQLa ale pewnei cos takiego istnieje.


--------------------
Go to the top of the page
+Quote Post
Vogel
post 18.01.2006, 15:10:59
Post #11





Grupa: Zarejestrowani
Postów: 402
Pomógł: 0
Dołączył: 20.01.2003

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


  1. SELECT a . *
  2. FROM ogloszenia a, ogloszenia b
  3. WHERE b.id =9658 AND a. idmarka = b. idmarka AND a.rocznik < b.rocznik
  4. ORDER BY a.rocznik DESC LIMIT 1


  1. SELECT a . *
  2. FROM ogloszenia a, ogloszenia b
  3. WHERE b.id =9658 AND a. idmarka = b. idmarka AND a.rocznik > b.rocznik
  4. ORDER BY a.rocznik ASC LIMIT 1


wy chciec, wy miec winksmiley.jpg

Ten post edytował Vogel 18.01.2006, 15:12:18


--------------------
Go to the top of the page
+Quote Post
matias
post 19.01.2006, 01:07:30
Post #12





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 3.10.2004

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


Działa do momentu w którym mamy kilka rekordów z takim samym rokiem produkcji samochodu. W tym przypadku zapytanie zwraca id rekordu zawierającego mniejszy lub większy rok produkcji. Czyli pomija wszystkie te rekordy, które mają ten sam rok.
Go to the top of the page
+Quote Post
Vogel
post 19.01.2006, 12:19:55
Post #13





Grupa: Zarejestrowani
Postów: 402
Pomógł: 0
Dołączył: 20.01.2003

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


fakt zapomnialem ze rocnziki nie sa unikalne winksmiley.jpg ale w takim razie wracamy do tego co napisalem na poczatku: wiesz co to LIMIT? O_o

  1. SELECT *
  2. FROM ogloszenia WHERE idmarka = 1 ORDER BY idmarka, rocznik LIMIT 2, 1;
  3. SELECT *
  4. FROM ogloszenia WHERE idmarka = 1 ORDER BY idmarka, rocznik LIMIT 3, 1;
  5. SELECT *
  6. FROM ogloszenia WHERE idmarka = 1 ORDER BY idmarka, rocznik LIMIT 4, 1;
  7. SELECT *
  8. FROM ogloszenia WHERE idmarka = 1 ORDER BY idmarka, rocznik LIMIT 5, 1;
  9. ...


--------------------
Go to the top of the page
+Quote Post
matias
post 19.01.2006, 20:09:59
Post #14





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 3.10.2004

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


Jasne że wiem cool.gif

Takie rozwiązanie brałem pod uwagę jednak trzeba numerować dodatkowo ogłoszenia z listy wyswietlanych i przkazywać ten numer przez URL do strony z danymi szczegółowymi ogłoszenia. Zachodzi jednak możliwość że w momencie przechodzenia przez kolejne szczegółowe ogłoszenia może ktoś dodać nowe ogłoszenie akurat w kategorii, którą przeglądamy. Wtedy przeglądana lista się rozszerza i nasz skrypt działający w ten sposób może pominąć 1 lub nawet kilka ogłoszeń.

W manualu do MySQL'a widziałem takie polecenie, ROWNO które numeruje rekordy automatycznie ale nie działa nawet w wersji 4.1 MySQL'a. Pisze tam coś o MaxDB. Co to jest? Jakaś wersja serwera ?
Go to the top of the page
+Quote Post
Kinool
post 20.01.2006, 08:23:06
Post #15





Grupa: Zarejestrowani
Postów: 560
Pomógł: 0
Dołączył: 15.07.2003
Skąd: Kwidzyn

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


Co to MaxDB smile.gif

a co do problemu to niedawno rozbiem cos podobnego, katalog produktów ze kategoriami rozne produkty w roznej kategorii id nie sa jakims ciagiem wiec pauje haos smile.gif np dla kategori o ID 15 sa produkty o ID 45, 67, 69, 94 bez probleu pobieram to za pomoca zapytania WHERE kategoria_id=15 AND product_id>"id pobranego rekordu" LIMIT 0,1

mankament tego jest taki ze sa 3 zapytania
1 - dla pobrania glownego produktu
2 - dla wyselekcjonowania produktu poprzedzajacego
3 - ---------------------||-------------- następnego

no ale w jednym zapytaniu raczej sie nie da smile.gif bynajmniej mi sie nie udalao hehe


--------------------
Go to the top of the page
+Quote Post
matias
post 20.01.2006, 21:19:43
Post #16





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 3.10.2004

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


No tak ale w twoim przypadku id produktów masz sortowane wg. ID od najmniejszego do największego więc bez problemu wyciągasz sobie poprzednie id wykonując zapytanie WHERE kategoria_id=15 AND product_id>"id pobranego rekordu" LIMIT 0,1 oraz dla następne id WHERE kategoria_id=15 AND product_id>"id pobranego rekordu" LIMIT 0,1

Ale co jeśli poprzednie ID są większe a następne mniejsze i tak wszystko pięknie wymieszane blink.gif
Go to the top of the page
+Quote Post
sobstel
post 20.01.2006, 21:27:45
Post #17





Grupa: Zarejestrowani
Postów: 853
Pomógł: 25
Dołączył: 27.08.2003
Skąd: Katowice

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


Cytat(matias @ 2006-01-20 21:19:43)
No tak ale w twoim przypadku id produktów masz sortowane wg. ID od najmniejszego do największego więc bez problemu wyciągasz sobie poprzednie id wykonując zapytanie WHERE kategoria_id=15 AND product_id>"id pobranego rekordu" LIMIT 0,1 oraz dla następne id WHERE kategoria_id=15 AND product_id>"id pobranego rekordu" LIMIT 0,1

Ale co jeśli poprzednie ID są większe a następne mniejsze i tak wszystko pięknie wymieszane blink.gif

jesli do wszystkiego stosujesz ten sam SELECT to nie ma znaczenia


--------------------
"If debugging is the process of removing bugs, then programming must be the process of putting them in..."
sobstel.org
Go to the top of the page
+Quote Post
SongoQ
post 21.01.2006, 00:08:10
Post #18





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

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


Cytat
jesli do wszystkiego stosujesz ten sam SELECT to nie ma znaczenia


Jak to nie.

Jesli masz rekordy z id tak ulozone:
41
1
634
3
42
63

To jak mozesz po nich przechodzic dalej, wstecz. Juz pisalem wiele razy sad.gif


--------------------
Go to the top of the page
+Quote Post
matias
post 21.01.2006, 01:05:22
Post #19





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 3.10.2004

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


Jesli rekordy są poukładane w wynikach zapytań wg. jakichś unikalnych wartości typu id - muszą być posortowane w górę lub w dół - to nie ma problemu sprawdzić poprzedni i następny rekord.

Schody zaczynają się właśnie dopiero gdy nie mamy żadnego klucza posortowanego a wartości co gorsza powtarzają się.

Ja już zaczałem kombinować w ten sposób:
Wszystkie parametry, pod kątem których mam posortowane produkty na liście przesyłam następnie do podstrony ze szczegółowym opisem produktu. Dodatkowo każdy produkt na liscie numeruję od 0 do xx produktów na liście.
Wszystko to przekazuję przez GET do podstrony z szczegółowym opisem produktu. Następnie wykonuję 3 zapytania. 2 zapytania na podstawie otrzymanych parametrów sortowania przez GET'a + LIMIT (numer rekordu na liście + 1 lub - 1), 1 . Trzecie zapytanie juz właściwe pobierające dane o produkcie.

Wadą jest to że w momencie dodania nowego rekordu w przeglądanej kategorii produktów numerowanie kolejno produktów zaczyna brać w łeb sadsmiley02.gif

Ten post edytował matias 21.01.2006, 01:07:14
Go to the top of the page
+Quote Post
Kinool
post 21.01.2006, 10:10:55
Post #20





Grupa: Zarejestrowani
Postów: 560
Pomógł: 0
Dołączył: 15.07.2003
Skąd: Kwidzyn

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


no ok ale primary key musi byc uniqe smile.gif zazwyczaj jest tez auto_increment (mysql) czy serial (postgresql) wiec kazda nastepna jes wieksza od poprzedniej! co daje nam mozliwosc sortowania.
Jesli baza zostala "zle" zaprojektowana to wtedy moga byc jakies kwiatki smile.gif


--------------------
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 03:40