tak jak proponował
Maly_swd tylko jeszcze na końcu dodaj LIMIT 1 [no prawie tak - zależy czy jako następne ma być starsze czy młodsze - bo jeśli starsze jako next to w odwrotnej kolejności i pozycja<45 - zależy w którą stronę pokazujesz

]
nie wiem jakie masz przechowywane informacje (dodatkowy tytuł czy coś co może jeszcze w alt linku chciałbyś zamieścić lub może inne informacje do powrotu na pager'a)
wiele informacji niby nie powiązanych ze sobą da się pobrać w jednym zapytaniu przy pomocy LEFT JOIN np. jak ja mam z newsami - mniejsza o nazwy - podam tylko przykład jako ogólną taką strukturę (ps. jeśli się da zoptymalizować zapytanie to możecie zarzucić ;p - nie wiem czemu przy count przewijało mi do innej pozycji i choć id mogłem wyciągnąć przez min lub max to gubiło inne informacje i trza było kolejne podzapytanie ;/)
/**
*
* @param int $id
* @return boolean true jeśli pobierze newsa o tym $id false jeśli brak
*/
public function newsGet($id) {
$select=$this -> PDO -> prepare('
SELECT nc.*, np.id_p, np.title_p, nn.id_n, nn.title_n, (c.news_count_all - nn.where_id_asc) AS where_id, c.news_count_all
FROM (SELECT * FROM `news` WHERE `id`=:id LIMIT 1) AS nc
LEFT JOIN (SELECT :id AS id_n_join, `id` AS id_n, `title` AS title_n, COUNT(`id`) AS where_id_asc FROM `news` WHERE `id`<:id ORDER BY `id` DESC LIMIT 1) AS nn ON nc.id=nn.id_n_join
LEFT JOIN (SELECT :id AS id_p_join, `id` AS id_p, `title` AS title_p FROM `news` WHERE `id`>:id ORDER BY `id` ASC LIMIT 1) AS np ON nc.id=np.id_p_join
LEFT JOIN (SELECT :id AS id_c_join, COUNT(`id`) AS news_count_all FROM `news`) AS c ON nc.id=c.id_c_join'
);
$select->execute(array(':id'=>(int
) $id)); $select=$select->fetch(PDO::FETCH_ASSOC);
if($select) {$this->news = $select;
$this->newsCountAll=$this->news['news_count_all'];
unset ($this->news['news_count_all']);}; return isset($this->news)?
true:false;}