1. 程式人生 > >PHP+MySQL對當月,當週,當日資料統計,並將相應欄位分組排序

PHP+MySQL對當月,當週,當日資料統計,並將相應欄位分組排序

在我們的開發過程中,往往會遇到對會員或者商家進行收益排行,分別按照當月,當週或者當日進行排序;當然,你可以先把用到的資料獲取到,然後再根據你想要的功能對資料進行相應處理。下面,我要給大家演示的是直接對MySQL進行操作,利用MySQL的一些統計函式,很方便的進行資料的篩選。

首先,給大家介紹的是使用php獲取當日、當週、當月以及昨日等時間戳;
  • 獲取今日開始時間戳和結束時間戳
    $today_start=mktime(0,0,0,date('m'),date('d'),date('Y'));
    $today_end=mktime(0,0,0,date('m'),date('d'
)+1,date('Y'))-1;
  • 獲取昨日起始時間戳和結束時間戳
    $yesterday_start=mktime(0,0,0,date('m'),date('d')-1,date('Y'));
    $yesterday_end=mktime(0,0,0,date('m'),date('d'),date('Y'))-1;
  • 獲取上週起始時間戳和結束時間戳
    $lastweek_start=mktime(0,0,0,date('m'),date('d')-date('w')+1-7,date('Y'));
    $lastweek_end=mktime(23,59,59,date
('m'),date('d')-date('w')+7-7,date('Y'));
  • 獲取本週周起始時間戳和結束時間戳
    $thisweek_start=mktime(0,0,0,date('m'),date('d')-date('w'+1),date('Y'));
    $thisweek_end=mktime(23,59,59,date('m'),date('d')-date('w')+7,date('Y'));
  • 獲取本月起始時間戳和結束時間戳
    $thismonth_start=mktime(0,0,0,date('m'),1,date('Y'));
    $thismonth_end
=mktime(23,59,59,date('m'),date('t'),date('Y'));
 下面是MySQL獲取當天,當週,當月等資料一些基本操作;
  • 查詢當天的資料
    SELECT * FROM 表名 WHERE TO_DAYS(時間欄位)=TO_DAYS(NOW());
  • 查詢昨天的資料
    SELECT * FROM 表名 WHERE TO_DAYS(NOW())-TO_DAYS(時間欄位)=1;
  • 查詢當週的資料
    SELECT * FROM 表名 WHERE YEARWEEK(DATE_FORMAT(時間欄位,'%Y-%m-%d'))=YEARWEEK(NOW());
  • 查詢上週的資料
    SELECT * FROM 表名 WHERE YEARWEEK(DATE_FORMAT(時間欄位,'%Y-%m-%d'))=YEARWEEK(NOW())-1;
  • 查詢當月的資料
    SELECT * FROM 表名 WHERE DATE_FORMAT(時間欄位,'%Y%m')=DATE_FORMAT(CURDATE(),'%Y%m');
  • 查詢上月的資料
    SELECT * FROM 表名 WHERE PERIOD_DIFF(DATE_FORMAT(NOW(),'%Y%m'),DATE_FORMAT(時間欄位,'%Y%m'))=1;
  • 查詢當年的資料
    SELECT * FROM 表名 WHERE YEAR(時間欄位) =YEAR(NOW());
  • 查詢最近7天的資料
    SELECT * FROM 表名 WHERE DATE_SUB(CURDATE(),INTERVAL 7 DAY)<=DATE(時間欄位);

下面我們將使用上述的一些查詢操作,對下圖所示的收益排行功能進行資料處理;
這裡寫圖片描述

  • 資料格式如上圖,下面直接上程式碼:
switch ($style) {

            case 'total'://總榜
                // $total = M('income_log')->group('userid')->sum($field);
                $total = M('')->query("SELECT userid,SUM($field) as sum FROM income_log GROUP BY userid ORDER BY SUM($field) DESC LIMIT 10");
                break;
            case 'day'://日榜
                $total = M('')->query("SELECT userid,SUM($field) as sum FROM income_log where TO_DAYS(date)=TO_DAYS(NOW()) GROUP BY userid ORDER BY SUM($field) DESC LIMIT 10"); 
                break;
            case 'week'://周榜
                $total = M('')->query("SELECT userid,SUM($field) as sum FROM income_log where YEARWEEK(DATE_FORMAT(date,'%Y-%m-%d'))=YEARWEEK(NOW()) GROUP BY userid ORDER BY SUM($field) DESC LIMIT 10"); 
                break;
            case 'month'://月榜
                $total = M('')->query("SELECT userid,SUM($field) as sum FROM income_log where DATE_FORMAT(date,'%Y%m')=DATE_FORMAT(CURDATE(),'%Y%m') GROUP BY userid ORDER BY SUM($field) DESC LIMIT 10"); 
                break;
            default: 
                break;
        }

下面是獲取到的資料結果,只需要對其進行處理即可;這裡,我是通過group by 將資料以使用者id進行分組,方便使用者資訊的獲取並排名;

Array
(
    [0] => Array
        (
            [userid] => 2
            [sum] => 6.00
        )

    [1] => Array
        (
            [userid] => 1
            [sum] => 6.00
        )

    [2] => Array
        (
            [userid] => 3
            [sum] => 1.00
        )

    [3] => Array
        (
            [userid] => 4
            [sum] => 0.20
        )

)

好了,今天就分享這麼多;關於mysql查詢速率優化方面的知識,由於本人所知淺薄,就不給大家闡述了-_-等知識豐富了再給大家分享這方面的內容~~~~一起加油哦!