Получите последние 5 сообщений в 2 таблицах - PullRequest
0 голосов
/ 06 февраля 2019

Как получить 5 последних сообщений (по дате (create_at)) из ответов + сообщений.

Пример лучше объяснения:

-- topics --
id  -  title  -  content  -  created_at
----------------------------------------
 1  -  title  -  content  -  2019-02-05 19:14:41
 2  -  title2 -  content2 -  2019-02-05 19:14:42
 3  -  title3 -  content3 -  2019-02-05 19:14:43
 4  -  title4 -  content4 -  2019-02-05 19:14:44
 5  -  title5 -  content5 -  2019-02-05 19:14:45

-- replies --
id  -  content  -  created_at
--------------------------
 1  -  content  -  2019-02-05 19:14:41
 2  -  content2 -  2019-02-05 19:14:42
 3  -  content3 -  2019-02-05 19:14:43
 4  -  content4 -  2019-02-05 19:14:44
 5  -  content5 -  2019-02-05 19:14:45

Ожидаемый результат:

OR 3 - title3 - content3 - 2019-02-05 19:14:43 
OR 3 - content3 - 2019-02-05 19:14:43 (doesn't matter)
4 - title4 - content4 - 2019-02-05 19:14:44
5 - title5 - content5 - 2019-02-05 19:14:45
4 - content4 - 2019-02-05 19:14:44
5 - content5 - 2019-02-05 19:14:45

Я использую MySQL

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Вы можете объединить оба запроса, которые извлекают всю информацию, упорядочить по дате, а затем ограничить до 5 результатов

Схема (MySQL v5.7)

CREATE TABLE topics (
  `id` INTEGER,
  `title` VARCHAR(6),
  `content` VARCHAR(8),
  `created_at` DATETIME
);

INSERT INTO topics
  (`id`, `title`, `content`, `created_at`)
VALUES
  (1, 'title', 'content', '2019-02-05 19:14:41'),
  (2, 'title2', 'content2', '2019-02-05 19:14:42'),
  (3, 'title3', 'content3', '2019-02-05 19:14:43'),
  (4, 'title4', 'content4', '2019-02-05 19:14:44'),
  (5, 'title5', 'content5', '2019-02-05 19:14:45');

CREATE TABLE replies (
  `id` INTEGER,
  `content` VARCHAR(8),
  `created_at` DATETIME
);

INSERT INTO replies
  (`id`, `content`, `created_at`)
VALUES
  (1, 'content', '2019-02-05 19:14:41'),
  (2, 'content2', '2019-02-05 19:14:42'),
  (3, 'content3', '2019-02-05 19:14:43'),
  (4, 'content4', '2019-02-05 19:14:44'),
  (5, 'content5', '2019-02-05 19:14:45');

Запрос № 1

SELECT id, CONCAT(title, ' - ', content) AS "title - content", created_at
FROM topics
UNION ALL
SELECT id, content, created_at
FROM replies
ORDER BY created_at DESC LIMIT 5;

Вывод

| id  | title - content   | created_at          |
| --- | ----------------- | ------------------- |
| 5   | title5 - content5 | 2019-02-05 19:14:45 |
| 5   | content5          | 2019-02-05 19:14:45 |
| 4   | content4          | 2019-02-05 19:14:44 |
| 4   | title4 - content4 | 2019-02-05 19:14:44 |
| 3   | content3          | 2019-02-05 19:14:43 |

Запрос № 2

-- If you want to sort them by date ascending, you can nest the previous query into another one, that you sort by date ascending
SELECT * FROM
(
    SELECT id, CONCAT(title, ' - ', content) AS "title - content", created_at
    FROM topics
    UNION ALL
    SELECT id, content, created_at
    FROM replies
    ORDER BY created_at DESC LIMIT 5
) subQuery
ORDER BY subQuery.created_at ASC;

Выход

| id  | title - content   | created_at          |
| --- | ----------------- | ------------------- |
| 3   | content3          | 2019-02-05 19:14:43 |
| 4   | content4          | 2019-02-05 19:14:44 |
| 4   | title4 - content4 | 2019-02-05 19:14:44 |
| 5   | content5          | 2019-02-05 19:14:45 |
| 5   | title5 - content5 | 2019-02-05 19:14:45 |

Просмотр на БД Fiddle

0 голосов
/ 06 февраля 2019

Это должно ответить на ваш вопрос

Схема (MySQL v5.7)

CREATE TABLE topics (
  `id` INTEGER,
  `title` VARCHAR(6),
  `content` VARCHAR(8),
  `created_at` datetime
);

INSERT INTO topics
  (`id`, `title`, `content`, `created_at`)
VALUES
  ('1', 'title', 'content', '2019-02-05 19:14:41'),
  ('2', 'title2', 'content2', '2019-02-05 19:14:42'),
  ('3', 'title3', 'content3', '2019-02-05 19:14:43'),
  ('4', 'title4', 'content4', '2019-02-05 19:14:44'),
  ('5', 'title5', 'content5', '2019-02-05 19:14:45');

CREATE TABLE replies (
  `id` INTEGER,
  `content` VARCHAR(8),
  `created_at` datetime
);

INSERT INTO replies
  (`id`, `content`, `created_at`)
VALUES
  ('1', 'content', '2019-02-05 19:14:41'),
  ('2', 'content2', '2019-02-05 19:14:42'),
  ('3', 'content3', '2019-02-05 19:14:43'),
  ('4', 'content4', '2019-02-05 19:14:44'),
  ('5', 'content5', '2019-02-05 19:14:45');

Запрос # 1

select * from
(
 select * from topics
 union all 
 select id, null, content, created_at from replies
) t 
ORDER BY created_at desc
LIMIT 5;

Результат

| id  | title  | content  | created_at          |
| --- | ------ | -------- | ------------------- |
| 5   |        | content5 | 2019-02-05 19:14:45 |
| 5   | title5 | content5 | 2019-02-05 19:14:45 |
| 4   |        | content4 | 2019-02-05 19:14:44 |
| 4   | title4 | content4 | 2019-02-05 19:14:44 |
| 3   |        | content3 | 2019-02-05 19:14:43 |

Просмотр на БД Fiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...