tp6处理mysql在一个表中根据某个字段分组后在组合查询和其有关的其他数据(分组处理)

问题描述:
现在有一个表(如下),需实现的功能将每个人所对应的contents和money合并展示到前端,组合后的数组为$arr[0]=[‘user_idno’=>‘147258’, ‘user’=>‘王五’, ‘contents’=>‘cont1,cont2,cont3’,‘money’=>‘9999,9999,999999’];…
tp6处理mysql在一个表中根据某个字段分组后在组合查询和其有关的其他数据(分组处理)_第1张图片
实现思路:
使用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;
    }
}

你可能感兴趣的:(php,thinkphp5,mysql,mysql,数据库,sql)