【问题标题】:Group by column and display count from all tables in mysql按列分组并显示mysql中所有表的计数
【发布时间】:2013-08-28 07:08:56
【问题描述】:

我有两个表:Table1 看起来像这样:

id   type    
1    bike     
2    car      
3    cycle
4    bike

Table2 看起来像这样:

id   type    
1    bike     
2    car 

我希望我的最终输出如下所示:

type   count_table1   count_table2
bike        2            1
car         1            1 
cycle       1            0

在 SQL 中执行此操作的最有效方法是什么?

【问题讨论】:

  • 我想,实际上在 mysql 中最有效的方法是另一种模式设计。

标签: mysql sql


【解决方案1】:

简单的解决方案,无需复杂的表连接和函数:

SELECT type, MAX(count_table1) as count_table1, MAX(count_table2) as count_table2 FROM (
(
    SELECT type, COUNT(*) AS count_table1, 0 AS count_table2
    FROM Table1
    GROUP BY type
) UNION (
    SELECT type, 0 AS count_table1, COUNT(*) AS count_table2
    FROM Table2
    GROUP BY type)
) AS tmp
GROUP BY type

SQL Fiddle

【讨论】:

  • 好(而且简单)的答案!
  • 很好的答案。它对我有用。而且我还想再添加一个表(即表 3),我还需要为该表计数..
  • 也许您应该考虑按照 STT LCU 的建议更改架构设计。不管怎样,这里是SQL Fiddle,有 3 张桌子
  • 也可以看看这个SQL Fiddle,只有一张桌子。这不是您一直在寻找的吗?
【解决方案2】:

你可以试试这个:

SELECT t1.TYPE, 
       ifnull(t1.COUNT1,0) CountTable1, 
       ifnull(t2.COUNT2,0) CountTable2 
FROM   (SELECT TYPE, 
               COUNT(*) count1 
        FROM   TABLE1 
        GROUP  BY TYPE)T1 
       LEFT JOIN (SELECT TYPE, 
                         COUNT(*) count2 
                  FROM   TABLE2 
                  GROUP  BY TYPE)T2 
              ON t1.TYPE = t2.TYPE 
UNION 
SELECT t1.TYPE, 
       t1.COUNT1, 
       t2.COUNT2 
FROM   (SELECT TYPE, 
               COUNT(*) count1 
        FROM   TABLE1 
        GROUP  BY TYPE)T1 
       RIGHT JOIN (SELECT TYPE, 
                          COUNT(*) count2 
                   FROM   TABLE2 
                   GROUP  BY TYPE)T2 
               ON t1.TYPE = t2.TYPE 

在SQL Fiddle 上查看我的工作示例。

【讨论】:

    【解决方案3】:
    SELECT a.TYPE, 
           COUNT(a.ID), 
           COUNT(b.ID) 
    FROM   TABLE1 AS a 
           LEFT OUTER JOIN TABLE2 AS b 
                        ON a.TYPE = b.TYPE 
    GROUP  BY a.TYPE 
    UNION 
    SELECT b.TYPE, 
           COUNT(a.ID), 
           COUNT(b.ID) 
    FROM   TABLE1 AS a 
           RIGHT OUTER JOIN TABLE2 AS b 
                         ON a.TYPE = b.TYPE 
    GROUP  BY b.TYPE 
    

    【讨论】:

    • 当我运行您的查询时,我得到的结果与我的预期不同。你能检查一下为什么会这样吗?我使用了我在 SQL Fiddle 中创建的数据集来处理您的查询:sqlfiddle.com/#!2/fc9ea/23
    • @Gidil。我应该使用 count(distinct id),谢谢指出。 sqlfiddle.com/#!2/fc9ea/36
    【解决方案4】:

    另一种方法

    SELECT a.type, 
           COALESCE(b.type_count, 0) count_table1,
           COALESCE(c.type_count, 0) count_table2
      FROM
    (
      SELECT type FROM Table1
      UNION 
      SELECT type FROM Table2
    ) a LEFT JOIN 
    (
      SELECT type, COUNT(*) type_count
        FROM Table1
       GROUP BY type
    ) b ON a.type = b.type LEFT JOIN
    (
      SELECT type, COUNT(*) type_count
        FROM Table2
       GROUP BY type
    ) c ON a.type = c.type
    

    一些解释:

    • 子查询 a 获取不同的类型列表(UNION 负责处理)。
    • 子查询b 和c 分别计算table1 和table2 中的类型出现次数。
    • 最后一个外部SELECT 使用LEFT JOIN 和COALESCE 将不存在的值替换为0。

    输出:

    |类型 | COUNT_TABLE1 | COUNT_TABLE2 | |-------|-------------|--------------| |自行车 | 2 | 1 | |汽车 | 1 | 1 | |循环 | 1 | 0 |

    这里是SQLFiddle演示

    【讨论】:

    • 感谢您的回答。
    【解决方案5】:
    select type, count(*) from table1 group by type
    
    select type, count(*) from table2 group by type
    

    Getting count of each item

    【讨论】:

      【解决方案6】:
      SELECT a.`TYPE`, 
             COALESCE(tbl1CNT,0) as tbl1CNT,
             COALESCE(tbl2CNT,0) as tbl2CNT
      FROM   (SELECT `TYPE` 
              FROM   TABLE1 
              UNION 
              SELECT `TYPE` 
              FROM   TABLE2) a 
             LEFT JOIN (SELECT `TYPE`, 
                               COUNT(*) AS tbl1CNT 
                        FROM   TABLE1 
                        GROUP  BY `TYPE`) b 
                    ON a.`TYPE` = b. `TYPE` 
             LEFT JOIN (SELECT `TYPE`, 
                               COUNT(*) AS tbl2CNT 
                        FROM   TABLE2 
                        GROUP  BY `TYPE`) c 
                    ON a.`TYPE` = c. `TYPE` 
      

      FIDDLE

      【讨论】:

      • 请注意,此查询返回一个 NULL,其中预期为 0。
      【解决方案7】:
      select
          T.type
          ,IFNULL(COUNT(T1.type),0) as 'count_table1'
          ,IFNULL(COUNT(T2.type),0) as 'count_table2'
      from
          Table1 as T1
          left join Table2 as T2 on T2.id = T1.id
      group by
          T.type
      
      union
      
      select
          T.type
          ,IFNULL(COUNT(T1.type),0) as 'count_table1'
          ,IFNULL(COUNT(T2.type),0) as 'count_table2'
      from
          Table2 as T
          left join Table1 as T1 on T1.id = T2.id
      group by
          T.type
      

      【讨论】:

      • 请注意,这个问题是在MYSQL中,所以ISNULL不起作用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多