按年月分表后,使用 Mysql UNION ALL对多表进行跨年月查询 (基于TP5框架,PHP)

基于Thinkphp5.0框架,以访问日志库为例,进行某段时间内访问日志的查询:

<?php

class systemlog{

    public function getLogListByCrossTable($params = array(), $order = '', $field = '', $page = 1, $limit = 10){
        // 初始化相关变量
        $time_begin = $params['access_time_begin']; //查询开始时间
        $time_end = $params['access_time_end']; //查询结束时间
        $startY = date('Y',strtotime($time_begin)); //开始时间所在年份
        $startm = date('m',strtotime($time_begin));  //开始时间的开始月份
        $endY = date('Y',strtotime($time_end));  //结束时间所在年份
        $endm = date('m',strtotime($time_end));  //结束时间的开始月份

        $ym_arr = [];//获取跨年月数组
        if($startY==$endY){ //不跨年夸
            for($i=$startm;$i<=$endm;$i++){
                $ym_arr[] = $startY.str_pad($i,2,'0',STR_PAD_LEFT);
            }
        }else{ //跨年跨月
            $dostartY = $startY;
            do{
                if($startY==$dostartY){
                    for($i=$startm;$i<=12;$i++){
                        $ym_arr[] = $startY.str_pad($i,2,'0',STR_PAD_LEFT);
                    } 
                }elseif($startY < $endY){
                    for($i=0;$i<=12;$i++){
                        $ym_arr[] = $startY.str_pad($i,2,'0',STR_PAD_LEFT);
                    }   
                }else{
                    for($i=1;$i<=$endm;$i++){
                        $ym_arr[] = $startY.str_pad($i,2,'0',STR_PAD_LEFT);
                    }  
                }
                $startY++;
            }while($startY<=$endY);
        }
        
        $map = [
            "access_time" => ['between',[$params['access_time_begin'],$params['access_time_end']]]
        ];
        
        foreach($ym_arr as $val){
            $union_select_arr[] = "SELECT * FROM ".'system_log.'.$this->base_tablename.'_'.$val." WHERE `access_time` BETWEEN '".$time_begin."' AND '".$time_end."'";
        }
    
        $list = Db::table('system_log.'.$this->base_tablename)->union($union_select_arr,true)->where($map)->select();
        $result['count'] = count($list);
        $result['data'] = $list;
    
        return $result;
    }
}
str_pad() 函数 :把字符串填充为新的长度。str_pad(string,length,pad_string,pad_type),

pad_type可选值:

  • STR_PAD_LEFT - 填充字符串的左侧。
  • STR_PAD_RIGHT - 填充字符串的右侧。这是默认的。
  • STR_PAD_BOTH - 填充字符串的两侧。如果不是偶数,则右侧获得额外的填充。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值