MySQL — как сделать запрос для выбора двух крайних?

В БД например 100 статей.
Необходимо зная ID одной из статей получить предыдущую и следующую.
Приведу пример: есть ID статьи = 47.
В результате запроса мы должны получить 46ю и 48ю запись.
Есть одно исключение, если мы находимся на 100й статье, то нужно получить 99ю и 1ю запись, т.е. по кругу.
То же самое касается и 1ой записи. Если ID статьи = 1, то результат должен быть: 2я и 100я записи

Можете написать примерный запрос, если с ним сталкивались ранее, или возможно есть идея решения задачи
  • Вопрос задан
  • 2541 просмотр
Пригласить эксперта
Ответы на вопрос 2
@IceJOKER
Web/Android developer
как-то так

$current_id = 47;
$next_article = $mysqli->query("select `id` from `articles` where `id`  = (select MIN(`id`) from `articles` where `id` > '$current_id')");
$prev_article = $mysqli->query("select `id` from `articles` where `id` = (select MAX(`id`) from `articles` where `id` < '$current_id')");
Ответ написан
Учитывая, что autoincrement-ный id-шник может быть "дырявым", получить следующий элемент можно так:
SELECT `id` FROM `table` WHERE `id` > CURRENT_ID ORDER BY `id` ASC LIMIT 1;

а предыдущий так:
SELECT `id` FROM `table` WHERE `id` < CURRENT_ID ORDER BY `id` ASC LIMIT 1;

При этом учитывая, что CURRENT_ID - это ID текущего элемента, а сортировка во всех трех запросам одинаковая.

Можно объединить три запроса в один, используя BETWEEN и LIMIT 3.

Но вот сделать цикличность на уровне только лишь БД - сложновато.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы