Выборка соседних значений id из таблицы Mysql

CEBEP

Новичок
Выборка соседних значений id из таблицы Mysql

Здравствуйте друзья, подскажите пожалуйста возможно ли решить проблему на уровне запроса в базу данных mySql.
Ситуация следующая:
в таблице есть поля id, значения(например): 1 2 3 4 5.
Зная один из id, необходимо вытащить его соседние id,
т.е. если id == 2, необходимо получить предыдущий id == 1 и следующий id == 3.
Или если id == 1, необходимо получить предыдущий id == 5 и следующий id == 2.
Спасибо, за помощь.
 

Dovg

Продвинутый новичок
В поиске есть
минимум 3 раза писали
 

CEBEP

Новичок
Dovg
К сожалению не нашел, если возможно, то дайте ссылочку, буду очень признателен.
zerkms
если id == 1, необходимо получить предыдущий id == 5 и следующий id == 2. - В частности это волнует гараздо больше... возможно ли вытащить запросом id - последнего, если предыдущего не существует.
Спасибо.
 

zerkms

TDD infected
Команда форума
не понимаю смысла кидания ссылками в такой примитивной задаче...
 

Alexandre

PHPПенсионер
не понимаю смысла кидания ссылками в такой примитивной задаче...
+1
все просто: SELECT id WHERE .... LIMIT 1
1) выбор всех id больше данного - лимитом отсекаем только один - получаем соседа справа
2) выбор всех id меньше данного - лимитом отсекаем только один - получаем соседа слева
всего два запроооса,
если хотим это выбрать одним запросом, то используем запрос вида:
1 UNION 2
 

Gas

может по одной?
имхо, запрос для новичка не самый простой
Код:
SELECT 
  IFNULL((SELECT id FROM `tbl` WHERE id < 4 ORDER BY id DESC LIMIT 1),MAX(id)) AS `prev`, 
  IFNULL((SELECT id FROM `tbl` WHERE id > 4 ORDER BY id ASC LIMIT 1),MIN(id)) AS `next`, 
FROM `tbl`;
но можно и по другому.
 

CEBEP

Новичок
Gas
Просто отлично, огромное спасибо Gas, это именно то что нужно!
SELECT
IFNULL((SELECT id FROM `tbl` WHERE id < 4 ORDER BY id DESC LIMIT 1),MAX(id)) AS `prev`,
IFNULL((SELECT id FROM `tbl` WHERE id > 4 ORDER BY id ASC LIMIT 1),MIN(id)) AS `next`,
FROM `tbl`;
 

Alexandre

PHPПенсионер
CEBEP а не проще:
два селекта:
1) SELECT id WHERE id<4 ORDER BY id DESC LIMIT 1
2) SELECT id WHERE id>4 ORDER BY id LIMIT 1
Один селект:
SELECT id WHERE id<4 LIMIT 1
UNION
SELECT id WHERE id>4 LIMIT 1
все ему разжевали.

кстати, граничные условия так и не уточнили - что будем выдавать, если это самая первая или самая последняя запись, но CEBEP это предусмотрел.
хотя на мой взгляд - раз их нет - то выдаем NULL.
 

CEBEP

Новичок
Спасибо парни, РЕСПЕКТ вам и Форуму за очень оперативную помощь! Отдельно спасибо Gas'у, так как хотелось одним запросом реализовать круговую выборку id, под круговой я подразумеваю выборку последнего или первого, если соседних не существует, в данном случае это соседние у id == 1 или id == 5, т.е. у id == 1 (получается крайний слева id == 5), а соответственно у id == 5 (получается крайний справа id == 1)/ Чего и можно добиться запросом Gas'а ;)
 

Gas

может по одной?
CEBEP
только одним запросом не всегда получается быстрее чем несколькими, да и ничего зазорного в этом нет (если только вместо join'а не делается цикл).
И в последнем после лучше сотри запрос, от него уже в глазах рябит :)
 
Сверху