繁体   English   中英

MySQL连接2个表和SUM收入-将两个查询合并为一个

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM