首页 > 解决方案 > MySQL - 如何使用分页从两个表中获取所有记录?

问题描述

我们有两张桌子credit_pointsdebit_pointsuser_id参考。我们关心的是我们希望通过 created_date 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 |
+----------+--------------+-------------+-----+--------------+

查询1:

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;

我知道上面的查询是完全错误的。请帮助我以正确的方式获取它。

查询2:

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 都在一个列中。

标签: mysqlsqljoin

解决方案


您可以通过使用将两个表中的数据组合到派生表中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语句中进行过滤。


推荐阅读