注意事项:
1.需要保持每个表的列必须数量和名称都一致
2.$fields保存公共的列,特殊列处理直接在每个表的field实现
3.如果需要join其他表查询,在最后的循环里处理
4.union的第二个参数是true,表示使用union ALL
5.因为需要列数一致,把每个表的特殊字段放到extend里面,然后循环处理
//union列表
function getMixedList(){
$pageNum=10;
$page=$this->request->get('page');
if(!$page){
$page=1;
}
//根据搜索条件设置$map
$map=array();
$city=$this->request->get('city');
if($city){
$map['area_id']=$city;
}
//这是公共列
$fields=['id','weigh','createtime','area_id','logoimage','user_id'];
$applys = model('applys')->field([implode(',',$fields),"'apply'"=>'type','name','concat(type,"-",applys_type_id)'=>'extend'])->where($map)->where('status="1"')->buildSql();
$huodong = model('huodong')->field([implode(',',$fields),"'huodong'"=>'type','title'=>'name',"price"=>'extend'])->where($map)->where('vertify="1"')->buildSql();
$news = model('news')->field([implode(',',$fields),"'news'"=>'type','title'=>'name',"'none'"=>'extend'])->where($map)->where('status="1"')->buildSql();
$list = Db::table($applys . ' list')->union($huodong,true)->union($news,true)->page($page,$pageNum)->order('weigh desc,createtime desc')->select();
foreach ($list as $key => $i) {
//循环处理,例如join的内容
$list[$key]['area']=model("area")->field('name,shortname')->find($i['area_id']);
if($i['type']=='apply'){
//处理apply的扩展元素
$extend=explode('-',$i['extend']);
}
}
$this->success(200,$list);
}
本文介绍了在ThinkPHP5中进行UNION查询时的注意事项,包括保持各表列数和名称一致、处理特殊列、加入JOIN操作、使用UNION ALL以及如何处理不同表的特殊字段。

1812

被折叠的 条评论
为什么被折叠?



