# MySQL用union把兩張沒有關聯的表合并,并使用條件查詢排序分頁
補充:(ps:調頭回來研究研究,補充)
1,簡單sql語句,先把2張表集合在一起,你發現news表數據在上面,接著才到card, 有沒有發現card 的name字段沒有,只顯示 title 字段 所以以前面的數據和字段優先
SELECT id,title,created_at FROM news UNION SELECT id,`name`,created_at FROM card ;

2,進一步優化,第一步看到2張表數據都在里面區分不出來是哪張表,所以改了下sql語句:
SELECT id,title,created_at ,0 as type FROM news UNION SELECT id,`name`,created_at ,1 as type FROM card ;

3,進一步優化,增加了個排序功能,如下:

### 場景應用:
類似某團的搜索,既可以搜索店鋪,也可以搜索商品;
類似某名片的搜索,既可以搜索企業,也可以搜索名片;
### 實現:
我用下面在laravel中實現的代碼案例說下:
~~~
$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);
//上面 xxxxxxxxxx->unionAll($test1); 其實發現也可以直接
->unionAll($test1 ->orderBy('updated_at', 'desc')
->paginate(request()->input('page_num') ?? 50);
然后下面的 $sql = $result->toSql();$result = DB::table(DB::raw("(.........操作都不需要了,
~~~
什么 ?上面的看不懂?好吧,我簡單列下:
1.當兩張表屬性完全相同時,可以直接合并(union會刪除重復數據,union all會返回所有結果集)
(1)將兩個表合并
~~~
select * from 表1
union
select * from 表2
select * from 表1
union all
select * from 表2
~~~
(2)將兩個表合并,并使用條件查詢
~~~
select * from ( select * from 表1
union select * from 表2)
as 新表名
where 條件1 and 條件2
~~~
2、當兩個表的屬性不同時,要分別查詢每個屬性,給不同屬性名取一個別名,例如收入和支出表:(表中的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個表結構要整合再一起排序分頁,就要通過 as 別名來轉換相同的字段,不然就被前面一個查詢條件的字段給覆蓋了,
坑2:上面的a1,b1,c1 順序要對著a2,b2,c2,才行,否則就被前面一個查詢條件的字段給覆蓋了,
錯誤示范:
1,a1,b1,c1 順序要對著c2,b2,a2,你查詢出來的a1值就會到c2里面,c1到a2里面,不信你可以試試。
坑3:2個查詢字段數量必須一致,否則就會報錯。
完事了,比較懶,想看詳情的話,看下面2個鏈接,前人寫的
————————————————
參考鏈接:https://blog.csdn.net/qq_43341807/article/details/120115151
參考鏈接:https://www.cnblogs.com/zhengchuzhou/p/10262260.html
- PHP書寫規則
- 代碼縮進
- 大括號{ }書寫規則
- 變量賦值對齊
- if條件判斷規范
- 避免嵌入式賦值
- 函數和方法的注釋
- 項目規范
- 業務邏輯logic
- model模型
- 控制器
- view視圖
- 定制項目開發
- 接口輸出變量格式
- mysql設計規范
- 二維碼系列
- php 用phprqcode 生成簡單的二維碼
- 小程序二維碼
- 其他小工具
- 獲取單個漢字拼音首字母
- js 調起打印多出一張空白的問題?
- php 2張圖片合拼
- 判斷一個漢字可以等于1個字符,2個字符,3個字符
- 微信小程序獲取頁面路徑
- 小程序js、canvas實現矩形圓角、圓形頭像圖片
- php phpMailer 發送郵件(親測有效)
- 系統配置表
- php 用tcpdf 生成pdf
- PHP mkdir():創建目錄
- php 通過svg動態生成生成后綴圖標
- php 本地安裝SSL證書
- php 生成首字母頭像
- php 接口數據壓縮返回,減少帶寬
- PHP向二維數組多維數組追加相同元素
- php 指定時間戳上加上一天,一個月,一年的方法
- Spreadsheet 表格生成
- php 多維數組排序 多維數組按照某個字段排序
- php根據開始和結束時間獲取期間日期
- php 獲取本周、上周、本月、上月及指定時間所在周、月的起止時間
- php GeoIP2通過ip獲取國家和地區城市
- 奇葩報錯問題
- session賦值報錯
- 服務器配置lnmp
- 開啟mysql binglog 日志
- lnmp 開啟遠程訪問3306
- 開啟mysql 慢日志查詢
- 開通Liunx 3306 端口(遠程連接開放)
- 搭建lnmp
- liunx 多臺服務器搭建共享文件夾圖片文件夾
- liunx 操作命令1
- nginx專區
- 禁止外部ip訪問
- 強制跳轉到https
- mysql專區
- 版本5.7報錯 only_full_group_by
- 把同一張表的一個字段的內容復制到另一個字段里
- lnmp關閉嚴格模式
- mysql 兩張不同結構的表連表查詢,合并,并分頁,排序 教你如何實現UNION
- mysql 查詢一張表中某個字段不同狀態的數量統計
- mysql數據庫快速插入百萬條級別的測試數據
- MySQL EXPLAIN 詳解,可用EXPLAIN來分析優化數據庫sql語句
- mysql 三星索引
- mysql 返回數據排名查詢獲取排名的方法,親測有效
- mysql使用查詢出來的值并且更新update新的表報錯?叫你一招
- mysql 怎樣自定義in查詢操作排序
- mysql 百萬級別和千萬級數據分頁查詢性能優化
- mysql 查詢某個字段按照逗號分割返回
- mysql 用sql命令導入數據庫
- mysql 根據某個字段的值匹配替換某個值
- Mysql中分組后取最新的一條數據排序
- Certbot-免費的https證書
- session_start()報錯問題
- 文件大打不開?代碼實現分割
- windows服務器專區
- apache 突然重啟動不了
- windows 定時任務
- liunx專區
- liunx 定時器檢查php是否能訪問,重啟
- liunx 操作命令
- 定時器 tp5 命令行
- liunx查看端口是否開放
- liunx上傳或者下載本地文件
- 前端
- jq克隆html
- Jquery添加元素(append,prepend,after,before四種方法區別對比)
- 小程序switch樣式修改
- css div 里面模塊 平均展開
- 安全小學堂
- 驗證碼一次一碼
- 實戰thinkphp6
- 前言
- 中間件
- 開啟多語言
- RabbitMQ 專區
- 下載RabbitMQ
- ftp專區
- Linux安裝vsftpd及配置詳解
- 小程序欄目
- 微信小程序封裝統一接口請求api數據
- 云數據庫
- 小程序云開發更新云函數數組的某一項,并且某個是變量代替
- php面試總結
- Mysql面試
- PHP面試知識
- Thinkphp框架小知識
- fastadmin 文檔
- fastadmin js 渲染 動態下拉(SelectPage)組件
- fastadmin 列表搜索欄 支持三級聯動 地區選項
- fastadmin searchList組件自定義數據返回
- 開發工具
- phpstorm 一直在Indexing,一直加載索引,無法正常使用
- PHP專區
- session 工作流程
- Redis
- php redis 基本操作
- SourceTree 3.3.9跳過注冊安裝
- composer 專區
- 手把手教你寫一個composer包
- freessl證書申請