Следующая и предыдущая записи по ID определённой записи
Необходимо выбрать из базы данных следующую и предыдущую записи по ID
, дате создания
и категории
определённой записи.
Таблица с данными
+----+------------+-------------+---------------------+ | id | name | category_id | created_at | +----+------------+-------------+---------------------+ | 1 | Article 1 | 1 | 2021-01-01 17:05:35 | | 2 | Article 2 | 1 | 2021-01-02 17:05:35 | | 3 | Article 3 | 4 | 2021-01-03 17:05:35 | | 4 | Article 4 | 2 | 2021-01-04 17:05:35 | | 5 | Article 5 | 3 | 2021-01-04 17:10:35 | | 6 | Article 6 | 2 | 2021-01-04 17:15:35 | | 7 | Article 7 | 4 | 2021-01-07 17:05:35 | | 8 | Article 8 | 3 | 2021-01-08 17:05:35 | | 9 | Article 9 | 3 | 2021-01-09 17:05:35 | | 10 | Article 10 | 2 | 2021-01-10 17:05:35 | +----+------------+-------------+---------------------+
Получить следующую запись
Входящие данные:
$id = 4; $category_id = 2; $created_at = '2021-01-04 17:05:35';
SQL запрос:
SELECT * FROM `article` WHERE (`id` > $id AND `category_id` = $category_id AND `created_at` > $created_at) ORDER BY `created_at` ASC, `id` ASC LIMIT 1
Результат:
+----+-----------+-------------+---------------------+ | id | name | category_id | created_at | +----+-----------+-------------+---------------------+ | 6 | Article 6 | 2 | 2021-01-04 17:15:35 | +----+-----------+-------------+---------------------+
Получить предыдущую запись
Входящие данные:
$id = 6; $category_id = 2; $created_at = '2021-01-04 17:15:35';
SQL запрос:
SELECT * FROM `article` WHERE (`id` < $id AND `category_id` = $category_id AND `created_at` < $created_at) ORDER BY `created_at` DESC, `id` DESC LIMIT 1
Результат:
+----+-----------+-------------+---------------------+ | id | name | category_id | created_at | +----+-----------+-------------+---------------------+ | 4 | Article 4 | 2 | 2021-01-04 17:05:35 | +----+-----------+-------------+---------------------+
Пример запроса для Yii2
Получить следующую запись:
/** * @param Article $article * @return null|array */ public function getNextArticle(Article $article): ?array { return Article::find() ->select(['name', 'slug']) ->where(['category_id' => $article->category->id]) ->andWhere(['>', 'id', $article->id]) ->orderBy(['id' => SORT_ASC, 'created_at' => SORT_ASC]) ->active() ->asArray() ->limit(1) ->one(); }
Получить предыдущую запись:
/** * @param Article $article * @return null|array */ public function getPrevArticle(Post $article): ?array { return Article::find() ->select(['name', 'slug']) ->where(['category_id' => $article->category->id]) ->andWhere(['<', 'id', $article->id]) ->orderBy(['id' => SORT_DESC, 'created_at' => SORT_DESC]) ->active() ->asArray() ->limit(1) ->one(); }