У меня была та же проблема, что и у Дэна, поэтому я использовал его ответ и улучшил его.
Сначала выберите индекс строки, здесь ничего не изменилось.
SELECT row
FROM
(SELECT @rownum:=@rownum+1 row, a.*
FROM articles a, (SELECT @rownum:=0) r
ORDER BY date, id) as article_with_rows
WHERE id = 50;
Теперь используйте два отдельных запроса. Например, если индекс строки равен 21, запрос на выбор следующей записи будет:
SELECT *
FROM articles
ORDER BY date, id
LIMIT 21, 1
Для выбора предыдущей записи используйте этот запрос:
SELECT *
FROM articles
ORDER BY date, id
LIMIT 19, 1
Имейте в виду, что для первой строки (индекс строки равен 1) предел будет равен -1, и вы получите ошибку MySQL. Вы можете использовать оператор if, чтобы предотвратить это. Просто ничего не выбирайте, так как в любом случае предыдущей записи нет. В случае с последней записью будет следующая строка и для нее не будет никакого результата.
Также имейте в виду, что если вы используете DESC для упорядочения, а не ASC, вы запрашиваете выбор следующей и предыдущей строк, но они остаются прежними, но переключаются.