[英]MySQL Join 2 tables and SUM revenue - combine two query into one
我有2张桌子。 我需要获得过去30天的总收入,其中有相同的日期和相同的user_id。
我需要将这些查询合并为一个JOIN SQL查询:
select * from user_revenue where user_id=$id AND `cdate` >= DATE(NOW() - INTERVAL 30 DAY)
select * from user_revenue_publisher where user_id=$id AND `cdate` >= DATE(NOW() - INTERVAL 30 DAY)
表格:user_revenue
USER_ID CDATE REVENUE
1 2019-03-15 15
2 2019-03-15 18
5 2019-03-15 29
9 2019-03-15 11
表格:user_revenue_publisher
USER_ID CDATE REVENUE
1 2019-03-15 15
1 2019-03-15 50
9 2019-03-15 21
9 2019-03-15 18
我需要结果:
USER_ID CDATE REVENUE
1 2019-03-15 80
2 2019-03-15 18
5 2019-03-15 29
9 2019-03-15 50
我想提一下,每个用户在2个表中都没有行,因此某些用户没有收益/表中没有行(例如,用户5在表user_revenue中仅具有行,而在表user_revenue_publisher中则没有)。
一种方法是使用UNION ALL
集运算符将两个结果集合并为一个集合,然后将该查询用作内联视图。 外部查询可以执行GROUP BY
操作来折叠行,并在其中使用SUM
聚合函数来累加收入。
像这样:
SELECT q.user_id
, q.cdate
, SUM(q.revenue) AS revenue
FROM ( SELECT r.user_id
, r.cdate
, r.revenue
FROM user_revenue r
WHERE r.user_id = ?
AND r.cdate >= DATE(NOW()) + INTERVAL -30 DAY
UNION ALL
SELECT p.user_id
, p.cdate
, p.revenue
FROM user_revenue_publisher p
WHERE p.user_id = ?
AND p.cdate >= DATE(NOW()) + INTERVAL -30 DAY
) q
GROUP
BY q.user_id
, q.cdate
ORDER
BY q.user_id
, q.cdate
还有其他查询模式将返回结果,这些结果也可能(或更好)满足规范要求并具有更好的性能。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.