昆明网站建设教学视频,前端开发培训费用,松江外贸网站建设,wordpress 未加密一#xff1a;首先来了解一下 union 和 unionAll
1#xff1a;取结果的并集#xff0c;是否去重 union#xff1a;对两个结果集进行并集操作#xff0c;不包括重复行#xff0c;相当于distinct#xff0c;同时进行默认规则的排序#xff1b; unionAll#xff1a;对两…一首先来了解一下 union 和 unionAll
1取结果的并集是否去重 union对两个结果集进行并集操作不包括重复行相当于distinct同时进行默认规则的排序 unionAll对两个结果集进行并集操作包括重复行即所有的结果全部显示不管是不是重复
2获取结果后的操作是否排序 union会对获取的结果进行排序操作。 unionAll不会对获取的结果进行排序操作 。
3通过下面例子来粗略了解一下
eg1:select * from A where id 5
union
select * from A where id 3 and id 6;第一句获取id1、2、3、4 结果集
第二句获取id4、5 结果集
总结果集为1、2、3、4、4、5
但因为 union 会去重所以最终结果集为1、2、3、4、5eg2:select * from A where id 5
union all
select * from A where id 3 and id 6;第一句获取id1、2、3、4 结果集
第二句获取id4、5 结果集
总结果集为1、2、3、4、4、5
union all 不会去重所以最终结果集为1、2、3、4、4、5
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)字段对应为
idid,titletitle,contentcontent,cover_imgimg,ISA_NNotice,type1,video_widthwidth,video_heightheight,video_durationduration,created_atcreated_at,updated_atupdated_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%表示需要匹配的关键字。