group by 和count的聯合使用問題
今天寫查詢語句遇到一個問題,就是用group by進行分組以后,用count統計分組以后的個數,
開始寫的語句大體是:
select count(m.fbrandid) from table as m group by m.fbrandid, month(fdate);
數據庫中的數據為:
+----------+------------+-----------+------------------------+
| Fbrandid | Fdate | Ftotalnum | Fpersons |
+----------+------------+-----------+------------------------+
| 32 | 2008-11-01 | 10 | 8 |
| 32 | 2008-11-02 | 10 | 8 |
| 32 | 2008-11-03 | 10 | 8 |
| 32 | 2008-11-04 | 10 | 8 |
| 98 | 2008-11-01 | 10 | 8 |
| 98 | 2008-11-02 | 10 | 8 |
| 98 | 2008-11-03 | 10 | 8 |
| 98 | 2008-11-04 | 10 | 8 |
+----------+------------+-----------+----------------+
查出來的結果居然不是同樣的一個值:
+------------+
| count(*) |
+-----------+
| 4 |
| 4 |
為何這里count(*)的結果是分組以后每組中的記錄的條數,而不是分組的數目.
解決辦法:
1 、將所有的數據查出來,在外面進行處理,這是非常不好的一種想法,請記住,我們用的是數據庫,要更多的依賴數據庫去解決問題,要有個信念:凡是在外面(程序)能解決的問題,用數據庫都能解決!
2 、嘗試引入子查詢,如下:
select count(1) from (
-> select fbrandid, month(fdate) from table as m
-> where 1 = 1
-> group by m.fbrandid, month(fdate)
-> ) aa;
就是說對查詢的結果再去統計,就是分組的數目了。
3. 請參考mysql的SQL_CALC_FOUND_ROWS() 和 FOUND_ROWS() 函數,似乎這個是最合理的了
結論:
1、 並不是說group by和count()操作不能同時使用,只是說查出來的東西不一樣,每個都有其應用的情況,如本例:最開始方法查出來的就是分組以后每個分組的記錄條數,如果程序中要計算每個分組的記錄條數,恰恰用這種方法。
2 、要更多靠數據庫去解決問題。
3 、意識到子查詢的威力,當你遇到解決不了的問題的時候,可以試試用子查詢去解決。(實踐證明的)