Вот как бы я это сделал:
-- next
SELECT * FROM articles WHERE id > ? AND private IS NULL ORDER BY id ASC LIMIT 1
-- previous
SELECT * FROM articles WHERE id < ? AND private IS NULL ORDER BY id DESC LIMIT 1
Я не уверен, как это сделать в одном запросе. Единственное, о чем я могу подумать, это, возможно, получить как отображаемую статью, так и следующую статью в одном запросе, но это может быть слишком запутанным.