這是我的代碼:
前提是做了一個view:att_sumbase
首先分開統計每天的中午、下午飯點人數,這時需要分別去除中午和下午重復打卡的人。用了記錄集的交,嵌套select的知識。
注意不能直接使用union,這里只能使用union all,因為union會去掉重復記錄,一個員工上午吃了,下午也吃了,union只會算一條,而union則能看出一共吃了兩次。
- //求出分組統計
- $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");
-
- //求得總數
- $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");
以下是編程時的借鑒:
- 在處理一個大數據量數據庫的時候
- 突然發現mysql對於count(*)的不同處理會造成不同的結果
- 比如執行
- SELECT count(*) FROM tablename
- 即使對於千萬級別的數據mysql也能非常迅速的返回結果
- 而對於
- SELECT count(*) FROM tablename WHERE.....
- mysql的查詢時間開始攀升
- 仔細查閱累下手冊,發現當沒有WHERE語句對於整個mysql的表進行count運算的時候
- MyISAM類型的表中保存有總的行數,而當添加有WHERE限定語句的時候Mysql需要對整個表進行檢索
- 從而得出count的數值
- 突然又想起來看到的不少新興的php程序對於count的處理並沒有很好的意識到這點
- 記錄下
- 順便提下mysql的DISTINCT的關鍵字有很多你想不到的用處
- 1.在count 不重復的記錄的時候能用到
- 比如SELECT COUNT( DISTINCT id ) FROM tablename;
- 就是計算talbebname表中id不同的記錄有多少條
- 2,在需要返回記錄不同的id的具體值的時候可以用
- 比如SELECT DISTINCT id FROM tablename;
- 返回talbebname表中不同的id的具體的值
- 3.上面的情況2對於需要返回mysql表中2列以上的結果時會有歧義
- 比如SELECT DISTINCT id, type FROM tablename;
- 實際上返回的是 id與type同時不相同的結果,也就是DISTINCT同時作用了兩個字段,必須得id與tyoe都相同的才被排除了,與我們期望的結果不一樣
- 4.這時候可以考慮使用group_concat函數來進行排除,不過這個mysql函數是在mysql4.1以上才支持的
- 5.其實還有另外一種解決方式,就是使用
- SELECT id, type, count(DISTINCT id) FROM tablename
- 雖然這樣的返回結果多了一列無用的count數據(或許你就需要這個我說的無用數據)
- 返回的結果是 只有id不同的所有結果和上面的4類型可以互補使用,就是看你需要什么樣的數據了