ThinkPHP5,使用unionAll取出两个毫无相关字段表的数据且分页

一:首先来了解一下 union 和 unionAll

1:取结果的并集,是否去重

  1. union:对两个结果集进行并集操作,不包括重复行,相当于distinct,同时进行默认规则的排序;

  2. unionAll:对两个结果集进行并集操作,包括重复行,即所有的结果全部显示,不管是不是重复;

2:获取结果后的操作,是否排序

  1. union:会对获取的结果进行排序操作。

  2. unionAll:不会对获取的结果进行排序操作 。

3:通过下面例子来粗略了解一下

eg1:select * from A where id < 5
union
select * from A where id > 3 and id < 6;第一句获取:id=1234 结果集
第二句获取:id=45 结果集
总结果集为:123445
但因为 union 会去重所以最终结果集为:12345eg2:select * from A where id < 5
union all
select * from A where id > 3 and id < 6;第一句获取:id=1234 结果集
第二句获取:id=45 结果集
总结果集为:123445
union all 不会去重所以最终结果集为:123445

4:总结

union all 只是合并查询结果,并不会进行去重和排序操作,在没有去重的前提下,使用 union all 的执行效率比 union 高。

二:ThinkPHP对 UNION 和 UNIONALL 的操作说明

UNION 操作作用于合并两个或多个 SELECT 语句的结果集。

使用示例:

Db::field('name')->table('think_user_0')->union('SELECT name FROM think_user_1')->union('SELECT name FROM think_user_2')->select();

闭包用法:

Db::field('name')->table('think_user_0')->union(function ($query) {$query->field('name')->table('think_user_1');})->union(function ($query) {$query->field('name')->table('think_user_2');})->select();

或者

Db::field('name')->table('think_user_0')->union(['SELECT name FROM think_user_1','SELECT name FROM think_user_2',])->select();

支持UNION ALL 操作,例如:

Db::field('name')->table('think_user_0')->unionAll('SELECT name FROM think_user_1')->unionAll('SELECT name FROM think_user_2')->select();

或者

Db::field('name')->table('think_user_0')->union(['SELECT name FROM think_user_1', 'SELECT name FROM think_user_2'], true)->select();

每个union方法相当于一个独立的SELECT语句。

特别注意UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。

示例:
通过下面的示例来具体深入了解

现在有两个表article表和notice

article表结构如下:
在这里插入图片描述
notice表结构如下:
在这里插入图片描述

需求:通过模糊查询标题(title)和内容(content)来综合获取article表和notice表的数据并且分页
两个表没有任何的关联字段,且字段数也不一样,这时候考虑使用 unionALL

$notice_array = ArticleModel::field('id,title,content,cover_img,type,video_width,video_height,video_duration,created_at,updated_at')->where('title|content','LIKE','%'.$search_value.'%')->unionAll("select id,title,content,created_at,updated_at from hq_notice where CONCAT(title, content) like '%$search_value%'")->limit($start,$end)->order('updated_at','desc')->select()->each(function ($item,$key){$item['content'] = filterContent($item['content']);});

这时候会出现如下报错:

SQLSTATE[21000]: Cardinality violation: 1222 The used SELECT statements have a different number of columns

两个表获取的列的数量不一样

根据需求还需要判断类型,此时先将article的查询语句添加一个数据表不存在的字段 ISA_N 默认值为 Article

->field('id,...,"不存在的字段值" as 不存在的字段名')ArticleModel::field('id,title,content,cover_img,"Article" as ISA_N,type,video_width,video_height,video_duration,created_at,updated_at')

并且 notice 表的获取字段数量也要保持一样,添加默认值

->unionAll("select id,title,content,'img','Notice','1','width','height','duration',created_at,updated_at from hq_notice)

字段对应为:

id=>id,title=>title,content=>content,cover_img=>'img',ISA_N=>'Notice',type=>'1',video_width=>'width',video_height=>'height',video_duration=>'duration',created_at=>created_at,updated_at=>updated_at

最后整合的语句如下:

$notice_array = ArticleModel::field('id,title,content,cover_img,"Article" as ISA_N,type,video_width,video_height,video_duration,created_at,updated_at')->where('title|content','LIKE','%'.$search_value.'%')->unionAll("select id,title,content,'img','Notice','1','width','height','duration',created_at,updated_at from hq_notice where CONCAT(title, content) like '%$search_value%'")->limit($start,$end)->order('updated_at','desc')->select()->each(function ($item,$key){$item['content'] = filterContent($item['content']);});

结果为:
在这里插入图片描述
没有的字段填充的是默认的值

补充:

concat函数

可以使用MySQL的concat函数,将多个字段合并成一个字段进行匹配。以下是示例语句:
SELECT * FROM table_name WHERE CONCAT(column1, column2) LIKE ‘%keyword%’
其中CONCAT函数将column1和column2合并成一个字段进行匹配,%keyword%表示需要匹配的关键字。

相当于使用or操作符
可以使用or操作符来连接多个like子句,让查询同时匹配多个字段。以下是示例语句:
SELECT * FROM table_name WHERE column1 LIKE ‘%keyword%’ OR column2 LIKE ‘%keyword%’
其中table_name为表名,column1和column2是需要匹配的字段名,%keyword%表示需要匹配的关键字。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/84794.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Cesium 问题:二三维切换矩形区域展示不够完整

文章目录 问题分析 问题 设置影响图层覆盖范围时&#xff0c;出现三维和二维切换后展示不够完整的情况&#xff0c; Cesium.Rectangle.fromDegrees(-180, -90, 180, 90)创建的矩形区域&#xff0c;按理说是已经设置了全覆盖&#xff0c;但切换二维后并不全覆盖 例如 三维下 切换…

Redis缓存与从数据取数据性能比较

Redis缓存与从数据取数据性能比较 为什么使用Redis 使用Redis缓存数据有多个原因&#xff0c;包括提高性能、降低数据库负载、减少响应时间和支持临时数据存储等。以下是一些主要原因以及Redis缓存的工作原理和好处&#xff1a; 1. 提高性能&#xff1a; 数据库查询通常是一…

睿趣科技:抖音开一家网店大概什么时候回本

随着移动互联网的迅猛发展&#xff0c;社交媒体平台如抖音成为了商家推广产品和服务的热门渠道之一。许多人都希望能够通过在抖音上宣传自己的产品&#xff0c;甚至考虑开一家网店&#xff0c;但回本的时间是一个关键问题。本文将探讨抖音开一家网店大概什么时候回本的问题。 首…

Ubuntu系统下载及安装教程

史上最全最新Ubuntu安装教程&#xff08;图文&#xff09; - 知乎 (说明&#xff1a;本教程介绍的是安装DeskTop版的系统) 1.官网下载镜像 官方网址: https://ubuntu.com/#download进入官网后会有最新版本的镜像下载地址&#xff0c;如果需要下载最新版本&#xff0c;直接点…

Git_06_创建分支/查看分支

创建分支 # 创建分支的同时&#xff0c;切换到该分支上 > git checkout -b 分支名称 # > git push origin 分支名称查看分支 # 查看本地分支 > git branch # 查看远程分支 > git branch -r # 查看所有分支 > git branch -a删除分支 # 删除本地分支 > git …

分布式应用之监控平台zabbix的认识与搭建

一、监控系统的相关知识 1.1 监控系统运用的原因 当我们需要实时关注与其相关的各项指标是否正常&#xff0c;往往存在着很多的服务器、网络设备等硬件资源&#xff0c;如果我们想要能够更加方便的、集中的监控他们&#xff0c;zabix可以实现集中监控管理的应用程序 监控的…

在Anaconda中安装xgboost(简单高效)

文章目录 一、检查二、打开Anaconda Prompt三、安装四、验证 一、检查 前提条件&#xff1a;windows环境下&#xff0c;anaconda&#xff08;这里指的是Anaconda3&#xff09;已安装&#xff0c;相应的numpy和sicpy也已安装。如果未安装需要先安装这两个库。 二、打开Anaconda…

RapidSSL的便宜单域名https证书

RapidSSL是Geotrust https证书品牌中的一款入门级https证书品牌&#xff0c;目前属于Digicert的子品牌。它是一款提供高性价比和广泛适用范围的https证书&#xff0c;无论是个人还是企业用户都可以轻松申请并快速验证。今天就随SSL盾小编了解RapidSSL旗下的单域名https证书。 …

Redis分布式锁的实现方式、实现原理

目录 一、分布式锁的重要性与挑战1.1 分布式系统中的并发问题竞态条件数据不一致死锁 二、分布式锁的基本原理与实现方式2.1 分布式锁的基本概念2.2 基于数据库的分布式锁原理与实现方式优缺点 2.3 基于缓存的分布式锁原理与实现方式优缺点 三、Redis分布式锁的实现与使用3.1 使…

安科瑞电流隔离传感器 BA穿孔交流电流变送器-安科瑞黄安南

一.产品原理和功能介绍 BA系列产品应用电磁感应原理&#xff0c;对电网中的交流电流进行实时测量&#xff0c;采用精密恒流技术和线性温度补偿技术&#xff0c;将其隔离变换为标准的直流信号输出 采用24伏或12伏安全电压供电&#xff0c;具有过载能力强、高精度、高隔离、高安…

Talk | ICCV’23 清华赵天辰:Ada3D-基于动态推理的3D感知模型压缩及软硬件协同优化

​本期为TechBeat人工智能社区第533期线上Talk&#xff01; 北京时间9月21日(周四)20:00&#xff0c;清华大学博士生—赵天辰的Talk已准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “Ada3D-基于动态推理的3D感知模型压缩及软硬件协同优化”&#xff0c;他…

JavaScript学习记录 | DOM事件流 事件冒泡-事件捕获-事件委托

目录 DOM事件流常见面试题事件冒泡与事件捕获事件冒泡使用场景事件捕获使用场景事件冒泡和事件捕获区别 事件委托 - 利用事件冒泡机制事件委托应用场景支持事件委托的事件事件委托的优缺点 DOM事件流 DOM事件流的三个阶段&#xff1a;捕获阶段 -> 目标阶段 -> 冒泡阶段 …

浏览器报错内容:Provisional headers are shown

浏览器报错内容&#xff1a;Provisional headers are shown 如下图&#xff1a; 解决方法&#xff1a;nginx 443 启用HTTP/2模式&#xff0c;如下图&#xff1a; server {listen 443 ssl http2;server_name callcenterda.umworks.com;client_max_body_size 200M;ssl_session_…

死锁详细解读

目录 死锁&#xff08;1&#xff09; 一、死锁的定义 二、产生死锁的原因 三、产生死锁的四个必要条件 四、解决死锁的方法 死锁&#xff08;2&#xff09; 第三节 死锁避免 一、死锁避免的概念 二、安全状态与安全序列 三、银行家算法 第四节、死锁的检测与解除 …

Python 打印所有水仙花数

"""打印三位水仙花数介绍&#xff1a;水仙花数是指一个 n 位数&#xff0c;它的每个位上的数字的 n 次幂之和等于它本身。例如&#xff0c;153 是一个三位的水仙花数&#xff0c;因为 (1**3) (5**3) (3**3) 153。下面是一个 Python 程序&#xff0c;用于生成…

LabVIEW开发基于物联网的多功能功率分析仪

LabVIEW开发基于物联网的多功能功率分析仪 根据技术规则&#xff0c;电气元件网络中的单个被创建为在标称正弦波振动制造频率下运行。失真顺序的电流和电压波与正弦波不同&#xff0c;它们或多或少地扭曲成形状。它是由交流网络中非线性组件的存在引起的&#xff0c;例如静态转…

32:TX Text Control ActiveX/ASP.NET/WinForms/WPF Crack

TX Text Control ActiveX 32.0 添加操作“普通”样式表的能力。 2023 年 9 月 14 日 - 15:38新版本 特征 脚注- 在文档中插入与 Microsoft Word 兼容的脚注。脚注是一种文字处理功能&#xff0c;允许用户在页面底部插入附加信息。 可编辑的[普通]样式表- 添加了操作[普通]样式的…

为什么tomcat要自定义线程池实现?

背景 最近在研究tomcat调优的问题&#xff0c;开发人员做过的最多的tomcat调优想必就是线程池调优了&#xff0c;但是tomcat并没有使用jdk自己的线程池实现&#xff0c;而是自定了了线程池&#xff0c;自己实现了ThreadPoolExecutor类位于org.apache.tomcat.util.threads包下 …

TikTok的全球影响:跨文化、跨国界的短视频文化

随着TikTok的崛起&#xff0c;短视频文化正在以前所未有的方式迅速传播&#xff0c;跨足了不同国家和文化的边界。本文将探讨TikTok的全球影响&#xff0c;以及它如何促进了跨文化交流和文化融合。 短视频&#xff1a;跨越语言和文化的沟通工具 TikTok的短视频格式具有独特的跨…

步步为营,如何将GOlang引用库的安全漏洞修干净

文章目录 引场景构建第一步、直接引用的第三方库升级修复策略1.确认是否为直接引用的第三方库2.找到需要升级的版本是否为release版本 第二步、间接引用的第三方库升级修复策略那么问题来了&#xff0c;我们这么间接引用库的对应的直接引用库是哪个呢&#xff1f; &#xff08;…