Следующая и предыдущая записи по ID определённой записи

    SQL    433

Содержание:

Следующая и предыдущая записи по 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();
}