【问题标题】:How can I combine these three queries?如何结合这三个查询?
【发布时间】:2011-03-30 00:31:54
【问题描述】:

我需要使用连接将三个 MySQL 查询组合成一个查询。不过,我在弄清楚如何做到这一点时遇到了很多麻烦。以下是三个查询。

select 
    sum(A.a) 
from A join B 
on A.BID = B.id 
where B.userID=userID

select 
    sum(C.c)
from D left join (C) 
on (D.id=C.DID)
 where D.userID = userID

select sum(E.e) from E where E.userID=userID

我需要以某种方式将所有这些查询组合成一个与用户表连接的查询,以便为每个 user.id 提供sum(A.a)+sum(C.C)+sum(E.e)。我尝试了所有表的左连接

user left join (A, B, C, D, E)
on ((A.BID = B.id and B.userID=user.id) 
    or (D.id=C.DID and D.userID = user.id) 
    or (E.userID=user.id))

这几乎是在黑暗中拍摄的,并且失败了。我不知道如何组合这三个查询,有人给我提示吗?

编辑澄清:我需要这个查询是用户表与上述查询的连接,因为我需要能够选择按 sum_value 排序的所有用户 ID。之前的三个查询是单独运行的,并使用单个用户 ID 进行参数化。

进一步编辑:尝试了所有加入用户查询的联合变体,我认为它不起作用。它非常接近于进行一些调整,但它仍然返回不正确的值。我不太确定它为什么会这样做。

【问题讨论】:

    标签: mysql join left-join


    【解决方案1】:
    select 
       ( ( select 
            sum(A.a)
        from 
            A join B 
            on A.BID = B.id 
        where 
            B.userID = user.ID ) + 
        ( select 
              sum(C.c)
          from 
              D left join (C) 
              on (D.id = C.DID)
         where D.userID = user.ID ) +
        ( select
              sum(E.e)
          from 
              E 
          where 
              E.userID = user.ID ) )
    from
        user
    

    【讨论】:

    • 宾果游戏!谢谢@CooL i3oY :) 甚至不需要加入......完全是在错误的树上吠叫。
    • 只剩下一件事,不用join也可以写。我相信它会提高速度。
    【解决方案2】:

    可能是这样的:

    select sum(sum_value), user_id from (
    select 
        sum(A.a) as sum_value, B.userID as user_id
    from A join B 
    on A.BID = B.id 
    GROUP BY B.userID
    
    UNION ALL
    
    select 
        sum(C.c) as sum_value, D.userID as user_id
    from D left join (C) 
    on (D.id=C.DID)
    GROUP BY D.userID
    
    UNION ALL
    
    select sum(E.e) as sum_value, E.userID as user_id from E
    GROUP BY E.userID
    )
    GROUP BY user_id
    

    【讨论】:

    • 已更新 - 是在我的脑海中完成的(而且已经很晚了,如果它不起作用,请放轻松:),仍然没有加入,但这会给你用户的总和一个查询的 ID。当然,您也可以在最后抛出 ORDER BY 以按照您希望的顺序获得结果。
    • 不用担心,感谢您的尝试。这几乎就是我刚刚尝试过的,它返回不正确的值。不太清楚为什么。其中一个值的 userID=37,对于每个子查询,它分别显示 230、8 和 50。但在某些情况下,它显示为 488。
    猜你喜欢
    • 2022-06-13
    • 2017-06-10
    • 1970-01-01
    • 2017-07-03
    • 2023-03-21
    • 2015-01-08
    • 1970-01-01
    相关资源
    最近更新 更多