[MySQL] Wybieranie poprzedniego i nast. wiersza

0

Mam następujący problem:

Wybieram z bazy potrzebny wpis:

SELECT * FROM `employees` WHERE `ID`='10' ORDER BY `Name`

Dostaję konkretny wiersz.

Moje pytanie: Jak wybrać z bazy poprzedni i następny (względem wybranego) wiersz?

Robiłem to poprzez

SELECT MAX(`ID`) AS `PrevID` FROM `employees WHERE `ID`<10 ORDER BY `Name`

ale to zwraca rząd z największym poprzednim ID, ale wpisy są posortowane w/g nazwy a nie ID i wybieram zły wiesz (to działa tylko jak wpisy są posortowane w/g ID)

Może jest jakaś funckja zwracająca numer wiersza i wtedy może wybrać ten wiersz gdzie różnica numerów wierszy jest najmniejsza (na plusie i na minusie)?


Dopisane:
Potrzebuję wybierając z listy posortowanej w/g imion/nazwisk wybierając konkretną osobę o znanym ID dodać na stronę przyciski Poprzedni i Następny ale z zachowaniem sortowania po imionach/nazwiskach, a tak bym zmienił sortowanie po ID

Póki co mam skrypt który po wybraniu konkretnego wiersza na nowo pobiera od początku wiersze i jak trafi na ten który znalazł to ID poprzedniego ustawia jako poprzedniID, podobnie z następnym, ale jak w bazie jest 1000 pracowników ... to to strata czasu, mocy proca, transferu między skryptem a bazą - w ogóle kiszka.
0

coś na kształt

SELECT * FROM employees
WHERE id = xx or id = (SELECT id FROM employees WHERE id < xx ORDER BY name DESC LIMIT 1) or id = (SELECT id FROM employees WHERE id > xx ORDER BY name LIMIT 1)
ORDER BY name

ale działa dopiero od MySQL v 4.1

0

Trudno w jednym zapytaniu, w wersji mysql gdzie nie mozna stosowac zagniezdzonych zapytan skonstruowac takie zapytanie. Wymyslilem cos takiego:

SELECT * FROM tabela a LEFT JOIN tabela b ON b.id>5 WHERE a.id<5 GROUP BY a.id ORDER BY a.id DESC LIMIT 1
Zapytanie nie jest idealne. Jezeli jest mozliwosc uzycia zapytan zagniezdzonych to lepsze rozwiazanie jest te, co proponuje moj przedmowca.

0

kod Misiekd na moje oko nie zadziala dobrze - co, jezeli mamy przykladowo tabele

id | name
---+-----
1  | aaa
2  | bbb
5  | ccc
4  | ddd
3  | eee

i chcemy wyswietlic rekord 5? poprzednik ma mniejsze id, a takze nastepnik ma takie

mi przychodzi do glowy tylko jeden pomysl - dodatkowa kolumna zawierajaca kolejnosc, gdy rekordy sa posortowane by name. Ewentualnie jezeli mozna porownywac zmienne tekstowe (wiekszy / mniejszy), no to zamiast id trzeba name porownywac

moje rozwiaanie bedzie wymagalo aktualizacji kolumny przy kazdej modyfikacji ktoregokolwiek rekordu, ale przy odpowiednich optymalizacjach, mysle ze da rade wykonywac to jednym zapytaniem. Za to bardzo uprosci zaytania przy odczycie

SELECT * FROM empl WHERE (sn > x-2) AND (sn < x+2)

gdzie sn to wlasnie numer z sortowania

0

fakt, nie pomyślałem o tym. Ale i na to jest sposób - działa na 100% na 5.0, przed chwilą sprawdzałem

SELECT * FROM employees
WHERE 
  id = xx OR 
  id = (SELECT id FROM employees WHERE name < (SELECT name FROM employees WHERE id = xx) ORDER BY name DESC LIMIT 1) OR 
  id = (SELECT id FROM employees WHERE name > (SELECT name FROM employees WHERE id = xx) ORDER BY name LIMIT 1)
ORDER BY name

a z przykładu Tomkiewicza zwróciło (przy xx = 5)

2	bbb
5	ccc
4	ddd
0

Dzięki wszystkim, dzisiaj tez pomyślałem że trzeba wybierać z warunkiem większe/mniejsze na kolumnę name a nie id, trochę kombinowałem ale kod @Misiekd działa, więc skorzystam z niego.
Dziękuję wszystkim

//Dopisane:
A takie jeszcze małe pytanko - jakby ID następnego i poprzedniego wpisu umieścić w tym samym rzędzie co szukany ID (poprzez JOIN) - dało by się?

Bo teraz wychodzi taki problem - jak jest element poprzedni a nie ma następnego (lub na odwrót) to SQL zwraca 2 wiersze (zamiast 3) i trzeba sprawdzać który wiersz zawiera szukany ID, a który zawiera ID poprzedniego/następnego, a jakby wszystko było w jednym wierszu tylko pod innymi nazwami kolum np. PrevID i NextID to było by lepiej.

Z MySQL'a korzystam od dłuższego czasu ale nigdy nie potrzebowałem takich "optymalizacji"

1 użytkowników online, w tym zalogowanych: 0, gości: 1