Вы можете удалить фильтрацию в своем подходе и добавить логику к ORDER BY
:
(SELECT n.*
FROM news
ORDER BY (id < 1), id DESC
LIMIT 1
) UNION ALL
(SELECT n.*
FROM news
ORDER BY (id > 1), id ASC
LIMIT 1
) ;
Если вы хотите, чтобы значения id
находились в одной строке, вы можете использовать агрегирование:
select coalesce(max(case when id < 1 then id end), max(id)) as prev_id,
coalesce(min(case when id > 1 then id end), min(id)) as next_id
from news n;
В обоих случаях 1
- это идентификатор образца, а «1» можно заменить любым значением.