group by 和count的聯合使用問題 [轉]


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 、意識到子查詢的威力,當你遇到解決不了的問題的時候,可以試試用子查詢去解決。(實踐證明的)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM