mysql - MySQL - 如何使用分页从两个表中获取所有记录?
问题描述
我们有两张桌子credit_points
,debit_points
有user_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 都在一个列中。
解决方案
您可以通过使用将两个表中的数据组合到派生表中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
语句中进行过滤。
推荐阅读
- java - 在java中查找多个日期间隔之间的差异
- vue.js - nuxt 在点击 this.$auth.fetchUser() 后获取用户名
- datatable - 从 SLT 表中删除部分数据
- html - 一些但不是所有的自定义 CSS 覆盖 Bootstrap 4 设置
- google-cloud-platform - 如何获取 GCP 云功能 CPU 时间统计信息
- reactjs - 函数句柄中的状态更新问题
- c++ - SWIG 和 C++ 枚举类
- javascript - 如何将 highchart 导航器和图形聚焦到结果集的一部分
- php - 将我的插件连接到 woo 商务支付系统
- python - 如何将我的腌制 ML 模型从 GCS 加载到 Dataflow/Apache Beam