Как выбрать «предыдущий» и «следующий» элементы в 1 запрос без union?
Не советую использовать сложные SQL запросы. Сложнее будет развивать.
Лучше сделать два метода:getPrevRecord($id, $count) {
 returen SELECT * FROM `table` WHERE id < $id ORDER id DESC LIMIT $count;
}
getNextRecord($count) {
 returen SELECT * FROM `table` WHERE id < $id ORDER id DESC LIMIT $count;
}
Вот так будет, без необходимости сортировать после выборки из бдSELECT * FROM `articles` WHERE id <> 20 AND ABS(id-20) < 4 ORDER BY id