【问题标题】:MySQL Join 2 tables and SUM revenue - combine two query into oneMySQL Join 2 个表和 SUM 收入 - 将两个查询合二为一
【发布时间】:2019-07-22 21:16:01
【问题描述】:

我有 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_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 中的行)。

【问题讨论】:

  • 为什么同时使用标签,SQL Server 和 MySQL?
  • 删除了 sql server 标签,因为这显然是 mysql 而不是 sql server。

标签: mysql database


【解决方案1】:

一种方法是使用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

还有其他查询模式会返回结果,这些结果也可能(或更好)以更好的性能满足规范。

【讨论】:

  • 非常感谢!您的 SQL 查询效果很好!我花了很多时间在上面。再次感谢您!
猜你喜欢
  • 2012-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-23
相关资源
最近更新 更多