@holdmann

Как выбрать «предыдущий» и «следующий» элементы в 1 запрос без union?

Всем привет, хочу выбрать 2 предыдущие и 2 следующие записи после искомого элемента в 1 запрос без использования UNION.

Оригинальный запрос:

SELECT * FROM (
(SELECT * FROM `table` WHERE id < 5 LIMIT 2)
UNION ALL
(SELECT * FROM `table` WHERE id > 5 LIMIT 2)
);


Сразу замечу, что UNION работает как надо, но чтобы запилить его в ActiveRecord нужна жуткая кастомщина в виде чистого sql.

Последнее, до чего додумался:

SELECT * FROM `table` WHERE id <> 5 ORDER BY id LIMIT 4 /* вот тут надо как-то сделать, чтобы 4 выбиралось не от начала таблицы, а 2 - слева, 2 - справа. */


Кстати, как принято в реальном мире в id могут быть дырки, поэтому AND BETWEEN не подходит :)

Спасибо, если кто поможет :)
  • Вопрос задан
  • 616 просмотров
Решения вопроса 1
Spyric
@Spyric
Веб-разработчик
Я так понимаю 5 - заранее известное поле.

Можно сделать что то типо:

SELECT *, ABS(id-5) as param FROM `table` WHERE id <> 5 ORDER BY param LIMIT 2


получит две записи разност id и 5 миимально
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Не советую использовать сложные 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;
}
Ответ написан
@holdmann Автор вопроса
Вот так будет, без необходимости сортировать после выборки из бд
SELECT * FROM `articles` WHERE id <> 20 AND ABS(id-20) < 4 ORDER BY id
Ответ написан
Ваш ответ на вопрос

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

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