2012-12-26 38 views
2

我有各種表格跟蹤系統,銷售,客戶賬戶等內創建的東西,並且他們都創建了它們的時間。我可以總結上一按每天使用以下查詢其中任何一項:MySQL - 按日計算多個表格

select date(created_time), count(*) from customers group by date(created_time) 

將會產生類似的輸出:

+--------------------+----------+ 
| date(created_time) | count(*) | 
+--------------------+----------+ 
| 2012-10-12   |  15 | 
| 2012-10-13   |  4 | 

那幹得雖然它跳過天的工作,當什麼也沒發生。

但是我想要做的是什麼產生一次爲多個表同樣的事情,產生類似:

+--------------------+--------------+------------------+ 
| date(created_time) | count(sales) | count(customers) | 
+--------------------+--------------+------------------+ 
| 2012-10-12   |   15 |    1 | 
| 2012-10-13   |   4 |    3 | 

我可以爲每個表單獨運行查詢和手工加入他們的行列,但跳過0天會使連接變得困難。

有沒有一種方法可以在單個mysql查詢中做到這一點?

+0

是否所有的表都具有相同的結構?您能否在日期(created_time)上執行外部聯接:從客戶a.date(created_time)= b的外部聯接銷售b中選擇a.date(created_time),a.count(*),b.count(*)。 date(created_time)group by a.date(created_time),b.date(created_time)。注意:像這樣使用這個date()函數將使SLOW查詢成爲可能。你有多少數據? – Melanie

+0

它們都有created_time列,否則它們是完全不同的。最大的是17萬行,增長速度很快。 –

+0

我不是一個查詢效率的專家,但我知道使用date()函數,因爲我建議上面會導致減速。也許有人可以評論使用計算列來存儲日期的功效? – Melanie

回答

1

試試這個:

SELECT created_time, SUM(customers), SUM(sales) 
FROM (SELECT DATE(created_time) created_time, COUNT(*) customers, 0 sales 
     FROM customers 
     GROUP BY created_time 
     UNION 
     SELECT DATE(created_time) created_time, 0 customers, COUNT(*) sales 
     FROM sales 
     GROUP BY created_time 
    ) as A 
GROUP BY created_time; 
+0

你應該使用'union all'而不是'union'。沒有必要刪除重複項。 –

+0

我們可以做到這一點,但這取決於用戶想要什麼類型的查詢 –

+0

不,它根本沒有依賴關係。這些行都是獨特的,因爲您旋轉了列的方式。使用'union all'而不是'union'。 –