# 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 ;
![](https://img.kancloud.cn/f4/24/f4244b57c3923a5d2e9314aa38010508_904x488.png)
2,进一步优化,第一步看到2张表数据都在里面区分不出来是哪张表,所以改了下sql语句:
SELECT id,title,created_at ,0 as type FROM news UNION SELECT id,`name`,created_at ,1 as type FROM card ;
![](https://img.kancloud.cn/f4/58/f4584bbc92f84057ab72f1ba506aedff_931x519.png)
3,进一步优化,增加了个排序功能,如下:
![](https://img.kancloud.cn/57/35/57356eefaa062bf4f273a771ce0fbbe0_1186x530.png)
### 场景应用:
类似某团的搜索,既可以搜索店铺,也可以搜索商品;
类似某名片的搜索,既可以搜索企业,也可以搜索名片;
### 实现:
我用下面在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
~~~
![](https://img.kancloud.cn/70/6e/706e4acb3e3340f40bdaebb32e6e6336_875x693.png)
温馨提示:
坑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证书申请