MySQL - Как получить все записи из двух таблиц с нумерацией страниц?

У нас есть две таблицы credit_points и debit_points которых user_id является ссылкой. Мы обеспокоены тем, что мы хотим получить все записи в едином порядке запроса по DESC с созданием предела и смещения. Пожалуйста, найдите список таблиц и выходную таблицу.

credit_points

+----+----------+--------------+---------------------+
| id | user_id  | credit_value |  created_date       |
+----+----------+--------------+---------------------+
|  1 | 111      | 13           | 2020-01-08 10:20:26 |
|  2 | 111      | 11           | 2020-01-09 11:20:23 |
|  3 | 111      | 7            | 2020-01-09 13:25:12 |
|  4 | 111      | 20           | 2020-01-13 12:25:17 |
+----+----------+--------------+---------------------+

debit_points

+----+----------+--------------+---------------------+
| id | user_id  | debit_value  |  created_date       |
+----+----------+--------------+---------------------+
|  1 | 111      | 13           | 2020-01-09 10:20:25 |
|  2 | 111      | 11           | 2020-01-11 11:18:54 |
|  3 | 111      | 15           | 2020-01-14 13:50:24 |
|  4 | 111      | 5            | 2020-01-14 15:23:12 |
+----+----------+------------+-----------------------+

Вывод должен быть:

+----------+--------------+---+------------------------------+
| user_id  | credit_value | debit_value | created_date       |
+----------+--------------+-------------+--------------------+
| 111      | NULL         | 5           |2020-01-14 15:23:12 |
| 111      | NULL         | 15          |2020-01-14 13:50:24 |
| 111      | 20           | NULL        |2020-01-13 12:25:17 |
| 111      | NULL         | 11          |2020-01-11 11:18:54 |
| 111      | 7            | NULL        |2020-01-09 13:25:12 |
| 111      | 11           | NULL        |2020-01-09 11:20:23 |
| 111      | NULL         | 13          |2020-01-09 10:20:25 |
| 111      | 13           | NULL        |2020-01-08 10:20:26 |
+----------+--------------+-------------+-----+--------------+

Query1:

SELECT 
   c.user_id, c.credit_value, d.debit_value, d.created_date
FROM credit_points c 
    RIGHT JOIN debit_points d ON(c.user_id=d.user_id)
WHERE c.user_id=111
ORDER BY c.created_date,d.created_date DESC 
limit 20;

Я знаю, что приведенный выше запрос совершенно неверен. Пожалуйста, помогите мне получить это правильно.

Query2:

SELECT user_id,credit_value, created_date
FROM credit_points where user_id=111
UNION ALL
SELECT user_id,debit_value,created_date
FROM debit_points where user_id=111 ORDER BY created_date DESC

Приведенный выше запрос (Query2) работает нормально, но мы не можем получить столбец debit_value . И credit_value, и debit_value находятся в одном столбце.

Всего 1 ответ


Вы можете объединить данные из обеих таблиц в производную таблицу с помощью UNION а затем выполнить SELECT над ней с необходимым смещением:

SELECT * FROM 
(
    SELECT user_id, credit_value, NULL AS debit_value, created_date FROM muvi_credit_points
    UNION ALL
    SELECT user_id, NULL AS credit_value, debit_value, created_date FROM muvi_debit_points
) t
WHERE user_id = 111
ORDER BY created_date DESC
LIMIT 0, 20

Конечно, фильтрация по user_id может быть выполнена во внутренних SELECT если это необходимо.


Есть идеи?

10000