问题描述:
现在有一个表(如下),需实现的功能将每个人所对应的contents和money合并展示到前端,组合后的数组为$arr[0]=[‘user_idno’=>‘147258’, ‘user’=>‘王五’, ‘contents’=>‘cont1,cont2,cont3’,‘money’=>‘9999,9999,999999’];…
实现思路:
使用mysql中的group by分组先将人员单独列出,在foreach中再去重新组合数组
完整代码:
use app\model\User;
use \think\facade\Db;
...
public function get_list_userdata($page=1, $limit=15){
$where = [
['id', '<', 100000]
];
// 这里使用子查询可以加快查询速度
// 用group by的同时再用limit,会将所有数据进行扫描重排,导致效率差;只需将group by和limit隔离使用
$subQuery = User::field("user_idno")->group("user_idno")->where($where)->buildSql(); // 生成构造子查询
$list = Db::table($subQuery . ' a')->page($page, $limit)->select();
if($list && count($list)>0){
$newList = [];
foreach($list as $val){
// 如果需查询金额最大的一条,在field中加入max(money)
// 根据user_idno查询该人员所有其他数据
$data_item = User::field("user,contents,money")->where(['user_idno' => $val['user_idno']])->select();
if($data_item && count($data_item) > 0){
$newList[$val['user_idno']] = [
'user_idno' => $val['user_idno'],
'user' => $data_item[0]['user'],
'contents' => '',
'money' => ''
];
foreach($data_item as $item){
$newList[$val['user_idno']]['contents'] .= $item['contents'].',';
$newList[$val['user_idno']]['money'] .= $item['money'].',';
}
}
unset($data_item);
}
// 重置数组
$newList = array_values($newList);
foreach($newList as &$nlist){
$nlist['contents'] = substr($nlist['contents'], 0, strlen($nlist['contents'])-1);
$nlist['money'] = substr($nlist['money'], 0, strlen($nlist['money'])-1);
}
return $newList;
}else{
return false;
}
}