2013-08-28 80 views
4

所有表列,顯示計數我有兩個表:表1是這樣的:集團通過在MySQL

id type  
1 bike  
2 car  
3 cycle 
4 bike 

而表2是這樣的:

id type  
1 bike  
2 car 

我希望我的最後輸出到看起來像下面這樣:

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

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

+1

其實這樣做在MySQL則是另一種模式設計最有效的方式,我想。 –

回答

3

簡單的解決方案,無需複雜的表連接&功能:

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

+1

好(簡單)的答案! – Gidil

+0

很棒的回答。這對我很有用。另外我還想添加一個表(即表3),並且我還需要爲該表計數。 – Seetha

+0

也許您應該考慮將架構設計更改爲STT LCU建議。無論如何,這裏是[SQL小提琴](http://sqlfiddle.com/#!2/e72ff/1/0)與3個表 –

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我的工作示例。

0
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 
+0

請注意,這個問題在MYSQL中,所以ISNULL不起作用。 – Gidil

2
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 
+1

@Gidil。謝謝 –

+1

當我運行你的查詢時,我得到了不同的結果。你能檢查爲什麼會發生這種情況嗎?我使用SQL小提琴中的數據集進行查詢:http://sqlfiddle.com/#!2/fc9ea/23 – Gidil

+1

@Gidil。我應該使用count(獨特的id),謝謝指出它。 http://sqlfiddle.com/#!2/fc9ea/36 –

2

另一種方式來做到這一點

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 

一些explan ation:

  • 子查詢a得到一個明確的類型列表(UNION負責)。
  • 子查詢bc分別計算table1table2中的類型出現次數。
  • 最後一個外部SELECT使用LEFT JOINCOALESCE將它們全部結合在一起,用0替代不存在的值。

輸出:

 
| TYPE | COUNT_TABLE1 | COUNT_TABLE2 | 
|-------|--------------|--------------| 
| bike |   2 |   1 | 
| car |   1 |   1 | 
| cycle |   1 |   0 | 

這裏是SQLFiddle演示

+0

感謝您的回答。 – Seetha

1
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

+1

請注意,此查詢在預期爲0的位置返回NULL。 – Gidil

+0

更新..立即檢查 –