Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: zapytanie sql pobierające sąsiednich wierszy wskazanego wiersza ;)
Forum PHP.pl > Forum > Bazy danych
VegetaSSJ
Trochę niezrozumiały tytuł topiku ale może tu uda mi się wyjaśnić.
Mam tabelę złożoną z kolumn: kol1, kol2, kol3 ... powiedzmy że w 'n'-tym wierszu w kol1 jest umieszona wartość 'abc'. Teraz tak, znam tą wartość 'abc', jednak nie wiem w którym dokładnie jest wierszu a potrzebuje pobrać wartości z wiersza 'n-1' i 'n+1' kol1.
Jeżeli ktoś potrafi napisać takie zapytanie bardzo bym prosił.
Sedziwoj
W bazie danych dane nie mają kolejności, czyli nie możesz określić który to n-ty wiersz...
Chyba że sobie je ponumerujesz, ale robisz to sam, baza i tak je przechowuje bez kolejności.
Dlatego używane jest pole np. id które jest dla każdego wiersza inne, wtedy możesz to pytanie zamienić na: mam wiersz o id=n i sprawdzam o id równym n-1 i n+1.
VegetaSSJ
Wiem kolego. w rzeczywistości kolumna 'kol1' ma wartości int, jest kluczem głównym z atrybutem autoicrement, chodzi tylko o to że może się zdarzyć że jak mam n=53 to nie ma wiersza n-1 ponieważ został wcześniej usuniety, chyba zostaje mi napisanie skryptu który będzie sprawdzał czy jest n-1, jeżeli nie to n-2 itd tylko czy może da się coś takiego napisać z poziomu sql aby uniknąć wysyłania masy zapytań ?
Sedziwoj
To jest trochę kłopotliwe, obawiam się że czegoś nie wiem, więc mojego rozwiązania nie napiszę bo może być kiepskie.
Ogólnie wybierasz wszystkie o id < tego i sortujesz malejąco i bierzesz o id> danego i sortujesz rosnąco... ale to jest raczej niezbyt optymalne. A raczej ja mam nikłą wiedzę z BD więc mogę czegoś nie wiedzieć.
fgk
Cytat(VegetaSSJ @ 22.04.2007, 11:40:19 ) *
Wiem kolego. w rzeczywistości kolumna 'kol1' ma wartości int, jest kluczem głównym z atrybutem autoicrement, chodzi tylko o to że może się zdarzyć że jak mam n=53 to nie ma wiersza n-1 ponieważ został wcześniej usuniety, chyba zostaje mi napisanie skryptu który będzie sprawdzał czy jest n-1, jeżeli nie to n-2 itd tylko czy może da się coś takiego napisać z poziomu sql aby uniknąć wysyłania masy zapytań ?


Ja bym zrobił tak bez zadnego kombinowania:

1. pobierasz id (numer) wiersza: "select `n` from `tabela` where kol1='abc'", zalozmy ze wynik zwrócony n=53,
2. pobierasz pierwszy wiersz o numerze mniejszym od tego n: "select * from `tabela` where `n`<53 LIMIT 1" -czyli przerwie przeszukiwanie tabeli po znalezieniu pierwszego wiersza o n<53
3. pobierasz pierwszy wiersz o numerze wiekszym od n: "select * from `tabela` where `n`>53 LIMIT 1"

moze sie zdazyc ze selecty z punktów 1, 2 lub 3 nic nie zwrócą więc bedziesz musiał jeszcze zabezpieczyc skrypt na taka ewentualnosc. Powodzenia i napisz jak poszło!
Sedziwoj
fgk a co ja niby napisałem?
Tylko że można to zrobić w jednym zapytaniu.
VegetaSSJ
Dzięki za naprowadzenie, nie wiem czemu sam na to nie wpadłem winksmiley.jpg wydaje się banalne, chyba się uwsteczniam winksmiley.jpg
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.