2013-07-26 42 views
0

我需要查詢具有相同列但內容不同的不同表。MySQL同樣查詢多個表

表A:

ID DocDate  Type 
1 2013-05-01 A 
2 2013-05-01 B 
3 2013-05-02 D 
4 2013-05-04 D 

表B:

ID DocDate  Type 
1 2013-05-01 F 
2 2013-05-03 G 
3 2013-05-03 G 
4 2013-05-05 H 

我需要什麼:

COUNT(Tablea.ID) COUNT(Tableb.ID) DocDate 
     2     1  2013-05-01 
     1     NULL 2013-05-02 
    NULL     2  2013-05-03 
     1     NULL 2013-05-04 
    NULL     1  2013-05-05 

任何幫助將非常感激。

+0

在一個查詢嗎?如果是這樣,它們之間有什麼關係? –

+1

你能告訴我們查詢你試過了嗎? –

回答

0

嘗試

SELECT d.docdate, a.total totala, b.total totalb 
    FROM 
(
    SELECT docdate 
    FROM tablea 
    UNION 
    SELECT docdate 
    FROM tableb 
) d LEFT JOIN 
(
    SELECT docdate, COUNT(*) total 
    FROM tablea 
    GROUP BY docdate 
) a ON d.docdate = a.docdate LEFT JOIN 
(
    SELECT docdate, COUNT(*) total 
    FROM tableb 
    GROUP BY docdate 
) b ON d.docdate = b.docdate 
 ORDER BY d.docdate 

輸出:

 
| DOCDATE | TOTALA | TOTALB | 
-------------------------------- 
| 2013-05-01 |  2 |  1 | 
| 2013-05-02 |  1 | (null) | 
| 2013-05-03 | (null) |  2 | 
| 2013-05-04 |  1 | (null) | 
| 2013-05-05 | (null) |  1 | 

這裏是SQLFiddle演示

0

有幾個方法可以得到這樣的結果。

最有效的查詢返回指定的行很可能將是:

SELECT NULLIF(SUM(c.cnt_a_id),0) AS cnt_a_id 
    , NULLIF(SUM(c.cnt_b_id),0) AS cnt_b_id 
    , c.DocDate 
    FROM (
     SELECT COUNT(a.ID) AS cnt_a_id 
       , 0   AS cnt_b_id 
       , a.DocDate AS DocDate 
      FROM Table_A a 
      GROUP BY a.DocDate 
      UNION ALL 
     SELECT 0 
       , COUNT(b.ID) 
       , b.DocDate 
      FROM Table_B b 
      GROUP BY b.DocDate 
     ) c 
GROUP BY c.DocDate 

適合覆蓋索引的每個表上的(DocDate, ID)將受益於大集性能。

另一個更容易理解但更昂貴的方法是創建表的UNION,然後執行GROUP BY。

SELECT NULLIF(COUNT(c.a_id)) AS cnt_a_id 
    , NULLIF(COUNT(c.b_id)) AS cnt_b_id 
    , c.DocDate 
    FROM (
     SELECT a.ID  AS a_id 
       , NULL + 0 AS b_id 
       , a.DocDate AS DocDate 
      FROM Table_A a 
      UNION ALL 
     SELECT NULL + 0 AS a_id 
       , b.ID  AS b_id 
       , b.DocDate AS DocDate 
      FROM Table_B b 
     ) c 
GROUP BY c.DocDate 

(這第二個查詢效率不高,因爲MySQL的物化在直列式視圖作爲臨時MyISAM表查詢中的方式;該第二查詢基本上創建的表-A和表-B級聯在一起的副本,並運行鍼對該查詢。

第一個查詢是有點不同,因爲它產生較小的集一起被並置。