【问题标题】:How to join 3 tables and get sum from result of individual joins?如何连接 3 个表并从单个连接的结果中获取总和?
【发布时间】:2015-05-22 15:34:20
【问题描述】:


我有以下情况:
表:用户:user_id、用户名、...
表:登录:user_id、login_date、...
表:point:user_id、points、point_time
连接将基于 users.user_id 与其他表。
现在,我想计算所有登录次数以及用户获得的所有积分的总和。
现在,当我这样做时:

select users.user_id,count(*) from users
inner join login on users.user_id=login.user_id
group by users.user_id

它返回计数为 36(例如)。 每当我跑步时:

select users.user_id,count(*),sum(points) from users
inner join point on users.user_id=point.user_id
group by users.user_id

返回总和为 400(例如),计数为 2。

但如果我将这两个查询结合起来:

select users.user_id,count(*),sum(points) from users
inner join login on users.user_id=login.user_id
inner join point on users.user_id=point.user_id
group by users.user_id

它返回计数为 72 (36 * 2),总和为 800 (400 *2)。 两次,因为存在多个 userId。
我尝试了几种方法,例如与 distincts 结合,但似乎没有任何效果。请帮忙。
如果可以单独使用连接就更好了。提前致谢。我正在使用 mysql 和 PHP。

【问题讨论】:

    标签: mysql sql join sum


    【解决方案1】:

    您可以对子查询中的点求和并在计数中选择不同的登录名

    select users.user_id,l.login,p.points from users
    inner join (select user_id, count(1) login from login
           group by login) as l on users.user_id=login.user_id
    inner join (select user_id, sum(point) as point 
            from point group by user_id ) as p on users.user_id=point.user_id
    

    【讨论】:

      【解决方案2】:

      您应该能够通过加入您的登录表然后包含一个子查询来获取您的点数:

      select users.user_id, count(*) as login_count,
        (select sum(points) from point 
         where point.user_id = users.user_id) as points_sum 
      from users
      inner join login on users.user_id=login.user_id
      group by users.user_id
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-15
        • 2016-11-18
        • 1970-01-01
        • 1970-01-01
        • 2020-09-30
        相关资源
        最近更新 更多