![]() |
![]() ![]() |
![]() |
![]()
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. |
|
|
![]()
Post
#2
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
funkcji jako takiej nie ma. ale jestsposób
![]() next:
prev:
-------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
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. |
|
|
![]()
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 ?
-------------------- |
|
|
![]()
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. |
|
|
![]()
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.
-------------------- |
|
|
![]()
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 ?
|
|
|
![]()
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:
Ten post edytował Vogel 18.01.2006, 14:24:50 -------------------- |
|
|
![]()
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 |
|
|
![]()
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.
-------------------- |
|
|
![]()
Post
#11
|
|
![]() Grupa: Zarejestrowani Postów: 402 Pomógł: 0 Dołączył: 20.01.2003 Ostrzeżenie: (0%) ![]() ![]() |
wy chciec, wy miec ![]() Ten post edytował Vogel 18.01.2006, 15:12:18 -------------------- |
|
|
![]()
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.
|
|
|
![]()
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
![]()
-------------------- |
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 0 Dołączył: 3.10.2004 Ostrzeżenie: (0%) ![]() ![]() |
Jasne że wiem
![]() 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 ? |
|
|
![]()
Post
#15
|
|
![]() Grupa: Zarejestrowani Postów: 560 Pomógł: 0 Dołączył: 15.07.2003 Skąd: Kwidzyn Ostrzeżenie: (0%) ![]() ![]() |
Co to MaxDB
![]() 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 ![]() 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 ![]() -------------------- |
|
|
![]()
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 ![]() |
|
|
![]()
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 ![]() 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 |
|
|
![]()
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 ![]() -------------------- |
|
|
![]()
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 ![]() Ten post edytował matias 21.01.2006, 01:07:14 |
|
|
![]()
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
![]() Jesli baza zostala "zle" zaprojektowana to wtedy moga byc jakies kwiatki ![]() -------------------- |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 14.08.2025 - 03:40 |