横向分表多个表数据查询获取当前页数据,适合每个表字段相同的分表数据查询
public getSelectTablesInfo;
/*
*数据量大的多个表分页查询
*/
public function getTableList($params)
{
$where = '';//自己定义
$dateArr = [];//存储每个表的表名及这个表各种条件后的数据总数
$countAll = 0;//过滤条件后 所有表的数据总和
foreach ($dates as $datesK => $datesV) {
//获取表名
$tableName = '表名';
//判断表名是否存在
if (!db::db()->tableExist($tableName )) continue;
//获取每个表的数据总数
$countSql = "SELECT count(*) tableCount FROM {$tableName } where 1 {$where}";
$countResult = db::db()->getOne($countSql, MYSQLI_ASSOC);
$count = $countResult['tableCount'] ?? 0;
if ($count > 0)
{
$dateArr[] = ['count'=>$count,'tableName'=>$tableName ];//
$countAll += $count;
}
}
$totalPage = ceil($countAll / $limit);
if (!isset($countAll) || $countAll <= 0 || $page > $totalPage)
{
return ['count'=>0,'list'=>[]];
}
// 获取应该查询哪个表 及对应表多少条数据
$this->getSelectTablesInfo($dateArr,0,$offset,$limit);
$list = $this->getSelectTablesInfo;
return ['count'=>$countAll ,'list'=>$list ];
}
下边是获取当前页数据
/**
* 获取应该查询哪个表 及对应表多少条数据
* @param array $data 二维索引数组 count表示这个表的数据总数 tableName表示这个表的表名
* @param int $key $data 二维数组的下标
* @param int $offset 开始位置
* @param int $limit 查询多少条
* @return array
*/
public function getSelectTablesInfo($data,$key=0,$offset=0,$limit=100)
{
$countKey = count($data) - 1;
//超过最后一个键 直接返回
if ($key > $countKey)
{
return $this->selectTables;
}
$balanceOffset = $data[$key]['count'] - $offset;
$balanceLimit = $data[$key]['count'] - $limit - $offset;
//表数据不够查询数据的开始位置
if ($balanceOffset <= 0)
{
//继续获取下个表数据
$lackOffset = abs($balanceOffset);//减少过滤表数据后的开始位置
$lackLimit = $limit;//还缺少多少条数据
$this->getSelectTablesInfo($data,$key+1,$lackOffset,$lackLimit);
}
//找到开始位置的表
if($balanceOffset > 0 )
{
if ($balanceLimit >= 0)
{
//表数据足够
$this->selectTables[] = [
'tableName' => $data[$key]['tableName'],
'offset' => $offset,
'limit' => $limit,
];
} else {
//表数据不足
$this->selectTables[] = [
'tableName' => $data[$key]['tableName'],
'offset' => $offset,
'limit' => $data[$key]['count'] - $offset,//总数据减去开始位置
];
//继续获取下个表数据
$lackOffset = 0;
$lackLimit = abs($balanceLimit);//还缺少多少条数据
$this->getSelectTablesInfo($data,$key+1,$lackOffset,$lackLimit);
}
}
return $this->selectTables;
}