代码之家  ›  专栏  ›  技术社区  ›  Sagynbek Kenzhebaev

MySQL,获取两个查询的总和

  •  1
  • Sagynbek Kenzhebaev  · 技术社区  · 6 年前

    我有三张不同的桌子 Product 具有不同的柱和结构,假设

    产品1 , 产品2 , 产品3

    所以,我试图得到三个具有相同属性的表的count(*)之和 user_id ,即foreach user\u id字段。

    表-产品1

    select P.user_id, count(*) 
    from Product1 P  
    group by P.user_id
    

    表-产品2

    select P.user_id, count(*) 
    from Product2 P  
    group by P.user_id
    

    表-产品3

    select P.user_id, count(*) 
    from Product3 P  
    group by P.user_id
    

    他们给了我 用户\u id 字段和 count(*) ,

    我可以为每个添加count(*)的结果吗 用户\u id 领域谢谢,提前

    6 回复  |  直到 6 年前
        1
  •  3
  •   Gordon Linoff    6 年前

    拥有三个结构相同的表通常是数据库设计不佳的标志。您应该找出将这些表合并到单个表中的方法。

    在任何情况下,都可以聚合结果。一种方法是:

    select user_id, sum(cnt)
    from ((select user_id, count(*) as cnt
           from product1
           group by user_id
          ) union all
          (select user_id, count(*) as cnt
           from product2
           group by user_id
          ) union all
          (select user_id, count(*) as cnt
           from product3
           group by user_id
          )
         ) up
    group by user_id;
    

    您要使用 union all 而不是 join 因为MySQL不支持 full outer join . Union all 确保包括所有三个表中的用户。

    两次聚合(在子查询和外部查询中)允许MySQL使用索引进行内部聚合。这可能是一个性能优势。

    此外,如果要查找特定用户或用户集,请使用 where 子查询中的子句。(在MySQL中)这比将所有数据聚集在子查询中然后进行过滤更有效。

        2
  •  2
  •   Ullas    6 年前

    使用组合结果 UNION 然后做加法。

    查询

    select t.`user_id`, sum(`count`) as `total` from(
        select `user_id`, count(*) as `count`
        from `Product1`
        group by `user_id`
        union all
        select `user_id`, count(*) 
        from `Product2` 
        group by `user_id`
        union all
        select `user_id`, count(*) 
        from `Product3`
        group by `user_id`
    ) t
    group by t.`user_id`;
    
        3
  •  2
  •   ScaisEdge    6 年前

    你可以把联合的结果加起来

    select user_id, sum(my_count)
    from (
    
    select P.user_id, count(*)  my_count
    from Product1 P  
    group by P.user_id
    UNION ALL
    select P.user_id, count(*) 
    from Product2 P  
    group by P.user_id
    UNION ALL 
    select P.user_id, count(*) 
    from Product3 P  
    group by P.user_id ) t
    group by user_id
    
        4
  •  2
  •   Abdul-Razak Adam    6 年前

    是的,您可以:)

    SELECT SUM(userProducts) userProducts 
    FROM (
        SELECT count(user_id) userProducts FROM Product1 WHERE user_id = your_user_id
        UNION ALL
        SELECT count(user_id) userProducts FROM Product2 WHERE user_id = your_user_id
        UNION ALL
        SELECT count(user_id) userProducts FROM Product3 WHERE user_id = your_user_id
    ) s
    
        5
  •  0
  •   Arzu    6 年前

    请在下面尝试。未在db中尝试,因此可能会出现语法错误。

    从中选择p.user\u id,sum(total)( 选择P.user\u id,count( )按p.user\U id列出的product1 p组总计 联合所有 选择P.user\u id,count( )按p.user\U id列出的product2 p组总计 联合所有 按P.user\u id从product3 P group中选择P.user\u id,count(*)total )a

        6
  •  0
  •   Akhil V Suku    6 年前

    是的,我们可以从不同的 tables 使用 join union 根据我们的要求。在您的情况下,Union All将完美工作,并且可以通过使用 count(1) 而不是 count(*) ,因为它使用 table 这通常是聚集索引。

    select user_id, sum(cnt)
    from ((select user_id, count(1) as cnt
           from product1
           group by user_id
          ) union all
          (select user_id, count(1) as cnt
           from product2
           group by user_id
          ) union all
          (select user_id, count(1) as cnt
           from product3
           group by user_id
          )
         ) a
    group by user_id;