?MySQL用union把兩張沒有關(guān)聯(lián)的表合并,并使用條件查詢排序分頁
?場(chǎng)景應(yīng)用:
類似某團(tuán)的搜索峭沦,既可以搜索店鋪贾虽,也可以搜索商品;
類似某名片的搜索吼鱼,既可以搜索企業(yè)蓬豁,也可以搜索名片;
?實(shí)現(xiàn):
我用下面在laravel中實(shí)現(xiàn)的代碼案例說下:
$test1= UserHistoryCompany::orWhere(function ($query) use($title) {
? ? ? ? ? ? $query->where('user_history_company.user_id', '=', $this->user_id)->where('is_delete',0)
? ? ? ? ? ? ? ? ->where('company.name', 'like', '%'.$title.'%');
? ? ? ? })
? ? ? ? ? ? ->join('company','company.id','=','user_history_company.company_id')
? ? ? ? ? ? ->select('user_history_company.id','user_history_company.user_id','user_history_company.company_id as c_id',
? ? ? ? ? ? ? ? 'user_history_company.updated_at','company.name as company_name','company.id as company_id','logo',
? ? ? ? ? ? ? ? DB::raw('2 as type , 0 as card_id , 0 as head_img , 0 as job_name , 0 as department_name , 0 as name '));
? ? ? ? $result= UserHistoryCard::orWhere(function ($query) use($title) {
? ? ? ? ? ? $query->where('user_history_card.user_id', '=', $this->user_id)->where('is_delete',0)
? ? ? ? ? ? ? ? ->where('company.name', 'like', '%'.$title.'%');
? ? ? ? })
? ? ? ? ? ? ->orWhere(function ($query) use($title) {
? ? ? ? ? ? ? ? $query->where('user_history_card.user_id', '=', $this->user_id)->where('is_delete',0)
? ? ? ? ? ? ? ? ? ? ->where('card.name', 'like', '%'.$title.'%');
? ? ? ? ? ? })
? ? ? ? ? ? ->orWhere(function ($query) use($title) {
? ? ? ? ? ? ? ? $query->where('user_history_card.user_id', '=', $this->user_id)->where('is_delete',0)
? ? ? ? ? ? ? ? ? ? ->where('card.mobile', 'like', '%'.$title.'%');
? ? ? ? ? ? })
? ? ? ? ? ? ->join('card','card.id','=','user_history_card.card_id')
? ? ? ? ? ? ->join('company','company.id','=','card.company_id')
? ? ? ? ? ? ->select('user_history_card.id','user_history_card.user_id','user_history_card.card_id as c_id',
? ? ? ? ? ? ? ? 'user_history_card.updated_at','company.name as company_name','company.id as company_id','logo',
? ? ? ? ? ? ? ? DB::raw('1 as type , user_history_card.card_id , card.head_img , card.job_name , card.department_name , card.name '))
? ? ? ? ? ? ->unionAll($test1);
? ? ? ? $sql = $result->toSql();
? ? ? ? $result = DB::table(DB::raw("($sql) as a "))
? ? ? ? ? ? ->mergeBindings($result->getQuery())
? ? ? ? ? ? ->orderBy('updated_at', 'desc')
? ? ? ? ? ? ->paginate(request()->input('page_num') ?? 50);
? ? ? ? ? dd($result);
什么 菇肃?上面的看不懂地粪?好吧,我簡(jiǎn)單列下:
1.當(dāng)兩張表屬性完全相同時(shí)琐谤,可以直接合并(union會(huì)刪除重復(fù)數(shù)據(jù)蟆技,union all會(huì)返回所有結(jié)果集)
(1)將兩個(gè)表合并
? ? ? ? select * from 表1
? ? ? ? union
? ? ? ? select * from 表2
? ? ? ? select * from 表1
? ? ? ? union all
? ? ? ? select * from 表2
(2)將兩個(gè)表合并,并使用條件查詢
? ? select * from ( select * from 表1
? ? union select * from 表2)
? ? as 新表名
? ? where 條件1 and 條件2
2、當(dāng)兩個(gè)表的屬性不同時(shí),要分別查詢每個(gè)屬性质礼,給不同屬性名取一個(gè)別名,例如收入和支出表:(表中的id和remark是相同屬性名旺聚,其他的屬性名都不同)
select * from(
(select id,
a1 as a,
b1 as b,
c1 as c,
d1? as d,
e1 as e,
updated_at
from a1_table)
union all
(select id,
a2 as a,
b2 as b,
c2 as c,
d2? as d,
e2 as e,
updated_at
from a2_table)
) as c
溫馨提示:
坑1:雖然2個(gè)表結(jié)構(gòu)要整合再一起排序分頁,就要通過 as 別名來轉(zhuǎn)換相同的字段眶蕉,不然就被最后一個(gè)查詢條件的字段給覆蓋了砰粹,
坑2:上面的a1,b1,c1 順序要對(duì)著a2,b2,c2,才行妻坝,否則就被最后一個(gè)查詢條件的字段給覆蓋了,
錯(cuò)誤示范:
1惊窖,a1,b1,c1 順序要對(duì)著c2,b2,a2刽宪,你查詢出來的a1值就會(huì)到c2里面,c1到a2里面界酒,不信你可以試試圣拄。
坑3:2個(gè)查詢字段數(shù)量必須一致,否則就會(huì)報(bào)錯(cuò)毁欣。
完事了庇谆,比較懶,想看詳情的話凭疮,看下面2個(gè)鏈接饭耳,前人寫的
————————————————
參考鏈接:https://blog.csdn.net/qq_43341807/article/details/120115151
參考鏈接:https://www.cnblogs.com/zhengchuzhou/p/10262260.html