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

news2025/4/8 23:37:10

一:首先来了解一下 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 会去重所以最终结果集为:12345

eg2:

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.coloradmin.cn/o/1031659.html

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

相关文章

JVM面试题-JVM对象的创建过程、内存分配、内存布局、访问定位等问题详解

对象 内存分配的两种方式 指针碰撞 适用场合&#xff1a;堆内存规整&#xff08;即没有内存碎片&#xff09;的情况下。 原理&#xff1a;用过的内存全部整合到一边&#xff0c;没有用过的内存放在另一边&#xff0c;中间有一个分界指针&#xff0c;只需要向着没用过的内存…

【QT】QRadioButton的使用(17)

QRadioButton这个控件在实际项目中多用于多个QRadioButton控件选择其中一个这样的方式去执行&#xff0c;那么&#xff0c;今天这节就通过几个简单的例子来好好了解下QRadioButton的一个使用。 一.环境配置 1.python 3.7.8 可直接进入官网下载安装&#xff1a;Download Pyt…

PIL或Pillow学习2

接着学习下Pillow常用方法&#xff1a; PIL_test1.py : 9, Pillow图像降噪处理由于成像设备、传输媒介等因素的影响&#xff0c;图像总会或多或少的存在一些不必要的干扰信息&#xff0c;我们将这些干扰信息统称为“噪声”&#xff0c; 比如数字图像中常见的“椒盐噪声”&…

聊一聊Twitter的雪花算法

什么是Twitter的雪花算法方法&#xff1f; 这是一种在分布式系统中生成唯一ID的解决方案。Twitter在推文、私信、列表等方面使用这种方法。 •ID是唯一且可排序的•ID包含时间信息&#xff08;按日期排序&#xff09;•ID适用于64位无符号整数•仅包含数字值 符号位&#xff08…

芋道商城,基于 Vue + Uniapp 实现,支持分销、拼团、砍价、秒杀、优惠券、积分、会员等级、小程序直播、页面 DIY 等功能

商城简介 芋道商城&#xff0c;基于 芋道开发平台 构建&#xff0c;以开发者为中心&#xff0c;打造中国第一流的 Java 开源商城系统&#xff0c;全部开源&#xff0c;个人与企业可 100% 免费使用。 有任何问题&#xff0c;或者想要的功能&#xff0c;可以在 Issues 中提给艿艿…

【从0学习Solidity】 10. 控制流,用solidity实现插入排序

【从0学习Solidity】10. 控制流&#xff0c;用solidity实现插入排序 博主简介&#xff1a;不写代码没饭吃&#xff0c;一名全栈领域的创作者&#xff0c;专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构&#xff0c;分享一些项目实战经验以及前沿技术的见解。关…

python中的NaN在质量控制中怎么处理?

一、数据中的缺省值 气象数据中经常存在缺省值&#xff0c;比如未入库的站点数据、比如海温格点实况数据中的陆地区域。这些缺省值往往被赋予NaN&#xff08;Not a Number&#xff0c;非数&#xff09;。NaN是计算机科学中数值数据类型的一类值&#xff0c;表示未定义或不可表…

远程端点管理和安全性

当今的企业网络环境是一个分布式动态环境&#xff0c;其中有许多需要管理、验证和保护的移动部件&#xff0c;而不会对最终用户的生产力产生任何威慑力。提供有效的端点管理安全性&#xff0c;同时仍提供无缝最终用户体验的解决方案至关重要。 Endpoint Central 执行的活动可确…

Linux高性能服务器编程 学习笔记 第六章 高级IO函数

pipe函数用于创建一个管道&#xff0c;以实现进程间通信&#xff1a; fd参数是一个包含两个int的数组。该函数成功时返回0&#xff0c;并将一对打开的文件描述符填入其参数指向的数组&#xff0c;如果失败&#xff0c;则返回-1并设置errno。 pipe函数创建的这两个文件描述符f…

用Python爬取短视频列表

短视频是一款备受欢迎的短视频分享平台&#xff0c;每天都有大量精彩的视频内容等待我们去探索。在本文中&#xff0c;我们将分享如何使用Python爬取短视频的视频列表&#xff0c;让您能够发现更多有趣的视频。 一、安装必要的库 在开始之前&#xff0c;确保已安装以下库&…

Unity——对象池

对象池是一种朴素的优化思想。在遇到需要大量创建和销毁同类物体的情景时&#xff0c;可以考虑使用对象池技术优化游戏性能。 一、为什么要使用对象池 在很多类型的游戏中都会创建和销毁大量同样类型的物体。例如&#xff0c;飞行射击游戏中有大量子弹&#xff0c;某些动作游戏…

java用easyexcel按模版导出

首先在项目的resources下面建一个template包&#xff0c;之后在下面创建一个模版&#xff0c;模版格式如下&#xff1a; 名称为 financeReportBillStandardTemplateExcel.xlsx&#xff1a; {.fee}类型的属性值&#xff0c;是下面实体类的属性&#xff0c;要注意这里面的格式&a…

iPhone15拉胯,国产手机用折叠屏大反攻!

文 | 智能相对论 作者 | K星 iPhone偷懒式的15代机型发布&#xff0c;让市场大跌眼镜&#xff0c;虽然在莫名的宗教虔诚下依旧卖得很好&#xff0c;但苹果走下神坛之巅已经板上钉钉。 但是&#xff0c;苹果从最高处摔落&#xff0c;却依旧在神坛之上&#xff0c;iPhone15拉胯…

【STM32笔记】HAL库定时器捕获配置、操作及通用函数定义

【STM32笔记】HAL库定时器捕获配置、操作及通用函数定义 文章目录 定时器捕获设置输入捕获滤波器设置输入捕获极性设置输入捕获映射关系设置输入捕获分频器 定时器配置定时器捕获函数全局变量定时器回调和定时器捕获回调频率计算 附录&#xff1a;Cortex-M架构的SysTick系统定…

css自学框架之二级下拉菜单

下拉菜单是我们开发中最常见&#xff0c;最常用的&#xff0c;今天我们就自学二级下来菜单。首先看一下最终效果&#xff1a; 一、css代码 .arrow-down::before {content: ""; width: 10px;height: 10px;border: solid ;border-width: 2px 2px 0 0;border-color: …

BIGEMAP在土地规划中的应用

工具 Bigemap gis office地图软件 BIGEMAP GIS Office-全能版 Bigemap APP_卫星地图APP_高清卫星地图APP 1.使用软件一般都用于套坐标&#xff0c;比如我们常见的&#xff08;kml shp CAD等土建规划图纸&#xff09;以及一些项目厂区红线&#xff0c;方便于项目选址和居民建…

软考复习 -- 计算机网络

1 网络互连设备 物理层&#xff1a;中继器和集线器&#xff08;多路中继器&#xff09;数据链路层&#xff1a;网桥和交换机&#xff08;多端口网桥&#xff09;网络层&#xff1a;路由器应用层&#xff1a;网关 2 广播域和冲突域 3 协议簇 4 网际层协议 4 TCP和UDP 4.1 TC…

零基础学前端(五)HTML+CSS实战:模仿百度网站首页

1. 该篇适用于从零基础学习前端的小白 2. 初学者不懂代码得含义也要坚持模仿逐行敲代码&#xff0c;以身体感悟带动头脑去理解新知识 一、实战&#xff1a;将百度网站首页补全 上一篇零基础学前端&#xff08;三&#xff09;重点讲解 HTML-CSDN博客我们已经将顶部两侧内容已经…

人机交互——对话管理

​人机交互中的对话管理主要是指在人机交互过程中&#xff0c;对交互的对话内容和流程进行管理&#xff0c;以实现自然、流畅、高效的交互效果。对话管理包括对话状态追踪、对话策略优化等多个方面。 对话状态追踪是指对当前对话的状态进行跟踪&#xff0c;例如对用户输入的语…

Observability:检测 OpenTelemetry 的推荐指南

作者&#xff1a;Bahubali Shetti OpenTelemetry (OTel) 正在稳步获得广泛的行业采用。 作为主要的云原生计算基金会 (CNCF) 项目之一&#xff0c;其提交数量与 Kubernetes 一样多&#xff0c;它正在获得主要 ISV 和云提供商的支持&#xff0c;为该框架提供支持。 许多来自金融…