Mysql中較為復雜的分組統計去重復值


這是我的代碼:
前提是做了一個view:att_sumbase
首先分開統計每天的中午、下午飯點人數,這時需要分別去除中午和下午重復打卡的人。用了記錄集的交,嵌套select的知識。
注意不能直接使用union,這里只能使用union all,因為union會去掉重復記錄,一個員工上午吃了,下午也吃了,union只會算一條,而union則能看出一共吃了兩次。

  1. //求出分組統計
  2. $att = $result->execute("select userid ,count(userid) as total,name from (select distinct userid,name from att_sumbase WHERE time BETWEEN '11:30' AND '12:30' union all select distinct userid,name from att_sumbase WHERE time BETWEEN '17:30' AND '18:30' order by userid) as foo group by userid");
  3.             
  4. //求得總數
  5. $sum = $result->execute("select sum(sum) as allnum from (select userid,count(distinct userid) as sum ,date,time,name from att_sumbase WHERE time BETWEEN '11:30' AND '12:30' union all select userid,count(distinct userid) as sum ,date,time,name from att_sumbase WHERE time BETWEEN '17:30' AND '18:30' ) as foo");


    以下是編程時的借鑒:    
  1. 在處理一個大數據量數據庫的時候
  2. 突然發現mysql對於count(*)的不同處理會造成不同的結果
  3. 比如執行
  4. SELECT count(*) FROM tablename
  5. 即使對於千萬級別的數據mysql也能非常迅速的返回結果
  6. 而對於
  7. SELECT count(*) FROM tablename WHERE.....
  8. mysql的查詢時間開始攀升
  9. 仔細查閱累下手冊,發現當沒有WHERE語句對於整個mysql的表進行count運算的時候
  10. MyISAM類型的表中保存有總的行數,而當添加有WHERE限定語句的時候Mysql需要對整個表進行檢索
  11. 從而得出count的數值
  12. 突然又想起來看到的不少新興的php程序對於count的處理並沒有很好的意識到這點
  13. 記錄下
  14. 順便提下mysql的DISTINCT的關鍵字有很多你想不到的用處
  15. 1.在count 不重復的記錄的時候能用到
  16. 比如SELECT COUNT( DISTINCT id ) FROM tablename;
  17. 就是計算talbebname表中id不同的記錄有多少條
  18. 2,在需要返回記錄不同的id的具體值的時候可以用
  19. 比如SELECT DISTINCT id FROM tablename;
  20. 返回talbebname表中不同的id的具體的值
  21. 3.上面的情況2對於需要返回mysql表中2列以上的結果時會有歧義
  22. 比如SELECT DISTINCT id, type FROM tablename;
  23. 實際上返回的是 id與type同時不相同的結果,也就是DISTINCT同時作用了兩個字段,必須得id與tyoe都相同的才被排除了,與我們期望的結果不一樣
  24. 4.這時候可以考慮使用group_concat函數來進行排除,不過這個mysql函數是在mysql4.1以上才支持的
  25. 5.其實還有另外一種解決方式,就是使用
  26. SELECT id, type, count(DISTINCT id) FROM tablename
  27. 雖然這樣的返回結果多了一列無用的count數據(或許你就需要這個我說的無用數據)
  28. 返回的結果是 只有id不同的所有結果和上面的4類型可以互補使用,就是看你需要什么樣的數據了


免責聲明!

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



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