( 此文章只做自己工作記錄使用)
假如每天一個表表的名稱定義格式爲:sys_client_20200106
1、確定要分頁的數據總表數(table_count)
sys_get_timespan(爲把日期差換算爲天數的函數)
$day_count=sys_get_timespan($start_date,$end_date,'d'); $day_count=$day_count+1;
2、循環查出沒個表滿足條件的數量、limit的起始位置(table_index)和結束位置(table_end)並統計所有滿足條件的數據數量total_count
$total_count=0;
for ($i=0;$i<$day_count;$i++)
{
$temp_date=date("Ymd",strtotime('-'.$i.' day',strtotime($end_date)));
$table_name="sys_client_".$temp_date;
$sql_suffix=" from $table_name where 1=1 ";
if ($regdate_start) $sql_suffix .= "and regdate>='$regdate_start' ";
if ($regdate_end) $sql_suffix .= "and regdate<='$regdate_end' ";
$sqlstr="select count(id) $sql_suffix";
//echo $sqlstr."<br>";
$table_count=$this->get_one_bysql($sqlstr);
if ($table_count>0)
{
$total_count+=$table_count;
$table_sub_arr[$table_sub_j]['name']=$table_name;
$table_sub_arr[$table_sub_j]['count']=$table_count;
if ($table_sub_j==0) {
$table_sub_arr[$table_sub_j]['start_index']=0;
$table_sub_arr[$table_sub_j]['end_index']=$table_count-1;
}
else
{
$table_sub_arr[$table_sub_j]['start_index']=$total_count - $table_count;
$table_sub_arr[$table_sub_j]['end_index']=$total_count-1;
}
$table_sub_j++;
}
}
3、確定請求分頁數據請求需要查詢的表的開始位置和需要查詢的limit數據條數確定查詢每個表的sql語句,用union連接組合每個查詢語句即可
$query_table_arr=[];
$j=0;
for ($i=0;$i<count($table_sub_arr);$i++)
{
if ($start>=$table_sub_arr[$i]['start_index'] && $end<=$table_sub_arr[$i]['end_index'])
{
$query_table_arr[$j]['name']=$table_sub_arr[$i]['name'];
$query_table_arr[$j]['start_index']=$start-$table_sub_arr[$i]['start_index'];
$query_table_arr[$j]['limitcount']=$page_count;
break;
}
if ($start>=$table_sub_arr[$i]['start_index'] && $end>=$table_sub_arr[$i]['end_index'])
{
$query_table_arr[$j]['name'] = $table_sub_arr[$i]['name'];
$query_table_arr[$j]['start_index'] = $start - $table_sub_arr[$i]['start_index'];
$query_table_arr[$j]['limitcount'] = $page_count;
$j++;
continue;
}
if ($start<$table_sub_arr[$i]['start_index'] && $end>$table_sub_arr[$i]['end_index'])
{
$query_table_arr[$j]['name'] = $table_sub_arr[$i]['name'];
$query_table_arr[$j]['start_index'] = 0;
$query_table_arr[$j]['limitcount'] = $page_count;
$j++;
continue;
}
if ($start<$table_sub_arr[$i]['start_index'] && $end<$table_sub_arr[$i]['end_index'] && $end>$table_sub_arr[$i]['start_index'])
{
$query_table_arr[$j]['name'] = $table_sub_arr[$i]['name'];
$query_table_arr[$j]['start_index'] = 0;
$query_table_arr[$j]['limitcount'] = $end - $table_sub_arr[$i]['start_index'] + 1;
$j++;
continue;
}
}
//dump($query_table_arr);
$source_sqlstr = "";
for ($i=0;$i<count($query_table_arr);$i++)
{
$table_name=$query_table_arr[$i]['name'];
if ($table_name) {
$sql_suffix=" from $table_name where 1=1 ";
if ($regdate_start) $sql_suffix .= "and regdate>='$regdate_start' ";
if ($regdate_end) $sql_suffix .= "and regdate<='$regdate_end' ";
$start=$query_table_arr[$i]['start_index'];
$source_sqlstr .= "(";
if (!$export)
$source_sqlstr .= "select * $sql_suffix order by regdate desc limit $start,".$query_table_arr[$i]['limitcount'];
else $source_sqlstr .= "select * $sql_suffix order by regdate desc";
$source_sqlstr .= ") UNION";
}
}
$source_sqlstr=substr($source_sqlstr,0,-5);
打印:dump($query_table_arr);
array(2) {
[0] => array(3) {
["name"] => string(19) "sys_client_20200206"
["start_index"] => int(1090)
["limitcount"] => int(10)
}
[1] => array(3) {
["name"] => string(19) "sys_client_20200205"
["start_index"] => int(717)
["limitcount"] => int(10)
}
}
打印$source_sqlstr如下:
(select * from sys_client_20200206 where 1=1 and regdate>='2020-01-04 00:00:00' and regdate<='2020-02-06 15:23:53' and controller_id=21 order by regdate desc limit 1090,10) UNION(select * from sys_client_20200205 where 1=1 and regdate>='2020-01-04 00:00:00' and regdate<='2020-02-06 15:23:53' and controller_id=21 order by regdate desc limit 717,10)