最近也是在写项目中碰到的这个问题,需要将两个SELECT查询结果组合起来进行分组排序,想到了用union方法,用TP的union操作根本无法完成复杂的union操作,于是搜罗了一下,先说一下union的用法,在说一下TP中如何实现复杂的union操作。

  一、UNION 用法

  一 UNION语法

  SELECT ...

  UNION[ALL | DISTINCT]

  SELECT ...

  [UNION [ALL | DISTINCT]

  SELECT ...]

  UNION用于把来自许多SELECT语句的结果组合到一个结果集合中。

  列于每个SELECT语句的对应位置的被选择的列应具有相同的类型。(例如,被第一个语句选择的第一列应和被其它语句选择的第一列具有相同的类型。www.111cn.net)在第一个SELECT语句中被使用的列名称也被用于结果的列名称。

  SELECT语句为常规的选择语句,但是受到如下的限定:

  ·只有最后一个SELECT语句可以使用INTO OUTFILE。

  ·HIGH_PRIORITY不能与作为UNION一部分的SELECT语句同时使用。如果您对第一个 SELECT指定了HIGH_PRIORITY,则不会起作用。如果您对其它后续的SELECT语句指定了HIGH_PRIORITY,则会产生语法错误。

  如果您对UNION不使用关键词ALL,则所有返回的行都是唯一的,如同您已经对整个结果集合使用了DISTINCT。如果您指定了ALL,您会从所有用过的SELECT语句中得到所有匹配的行。

  DISTINCT关键词是一个自选词,不起任何作用,但是根据SQL标准的要求,在语法中允许采用。(在MySQL中,DISTINCT代表一个共用体的默认工作性质。)

  您可以在同一查询中混合UNION ALL和UNION DISTINCT。被混合的UNION类型按照这样的方式对待,即DISTINCT共用体覆盖位于其左边的所有ALL共用体。DISTINCT共用体可以使用UNION DISTINCT明确地生成,或使用UNION(后面不加DISTINCT或ALL关键词)隐含地生成。

  如果您想使用ORDER BY或LIMIT子句来对全部UNION结果进行分类或限制,则应对单个地SELECT语句加圆括号,并把ORDER BY或LIMIT放到最后一个的后面。以下例子同时使用了这两个子句:

 代码如下  

(SELECT a FROM tbl_name WHERE a=10 AND B=1)UNION(SELECT a FROM tbl_name WHERE a=11 AND B=2)ORDER BY a LIMIT 10;

(SELECT a FROM tbl_name WHERE a=10 AND B=1)UNION(SELECT a FROM tbl_name WHERE a=11 AND B=2)ORDER BY a LIMIT 10;

  这种ORDER BY不能使用包括表名称(也就是,采用tbl_name.col_name格式的名称)列引用。可以在第一个SELECT语句中提供一个列别名,并在ORDER BY中参阅别名,或使用列位置在ORDER BY中参阅列。(首选采用别名,因为不建议使用列位置。)

  另外,如果带分类的一列有别名,则ORDER BY www.111cn.nEt子句必须引用别名,而不能引用列名称。以下语句中的第一个语句必须运行,但是第二个会运行失败,出现在'order clause'中有未知列'a'的错误:

 代码如下  

(SELECT a AS b FROM t) UNION (SELECT ...) ORDER BY b;

(SELECT a AS b FROM t) UNION (SELECT ...) ORDER BY a;

To apply ORDER BY or LIMIT to an individual SELECT, place the clause inside the parentheses that enclose the SELECT。

  为了对单个SELECT使用ORDER BY或LIMIT,应把子句放入圆括号中。圆括号包含了SELECT。

 代码如下  

(SELECT a FROM tbl_name WHERE a=10 AND B=1 ORDER BY a LIMIT 10)UNION(SELECT a FROM tbl_name WHERE a=11 AND B=2 ORDER BY a LIMIT 10);

  二 实例扩展

  union可以对同一个表的两次查询联合起来. 这样做的益处也非常明显, 比如在blog应用中, 可以利用一条sql语句实现置顶blog和普通blog的分页显示.

 代码如下  
(   
SELECT * FROM `blog`
WHERE top=1   
ORDER BY created DESC   
)   
UNION
(  
SELECT *   
FROM `blog`   
WHERE top = 0   
ORDER BY created DESC   
) LIMIT 2 , 3  

  注:union要求联合的两个表所要查找的数据列要一样多,如果一个表中没有另一个表的字段,可以用NULL代替

  三,实例

  UNION

 代码如下  

select * from 

select * from ... 
union all 
select * from ... 
) aaa 
order by aaa.xxx desc;

  中的UNION

  UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION。如:

 代码如下  

select * from gc_dfys union select * from ls_jg_dfys

  这个SQL在运行时先取出两个表的结果,再用排序空间进行排序删除重复的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序。

  MySQL中的UNION ALL

  而UNION ALL只是简单的将两个结果合并后就返回。这样,如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了。

  从效率上说,UNION ALL 要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复的数据的话,那么就使用UNION ALL,如下:

 代码如下  

select * from gc_dfys union all select * from ls_jg_dfys

  解决mysql中union排序的问题 .

  关于union双向排序(mysql)

  群里的朋友问了一个mysql查询的问题

  需求是这样的

  论坛希望在显示帖子列表时侯前三条是点击量最多的,即按点击次数查询,

  余下的按时间查询

  实际就是两个union的排序都生效

  Sql代码

 代码如下  

(select * from (select * from table order by colnum desc) a);  
(select * from table order by colnum limit 0,2
)
UNION  (select * from (select * from table order by colnum desc) a);

  估计很多人会有这个需求。

 代码如下  
SELECT *,1 as ord FROM `women` where status = 2 and title like '%2014%' or title like '%秋冬%' union (select *,2 as ord FROM `women` where status = 2 and keywords like '%2014%' or keywords like '%秋冬%') ORDER BY ord,id desc limit 0,15;

http://www.3lian.com/edu/2014/01-25/126892.html相关推荐

  1. 2014/5/25 多校

    A: 1 #include<iostream> 2 #include<stdio.h> 3 #include<string.h> 4 #include<set ...

  2. 随笔2010.01.25

    用例契约 用例:使用事件委托 概要: .NET事件委托的编码过程 基本事件流: 定义一个事件参数类,继承System.EventArgs: 声明一个委托A,假设为public delegate A(E ...

  3. wifi共享精灵2014.04.25.001已经更新,wifi热点中文名走起!

    五一回来后,有个惊喜,wifi共享精灵有了最新动向.不晓得wifi共享精灵是啥的朋友,我来解释下,它就相当于一个无线路由器.说起来,Wifi共享精灵正式版2014.04.25.001(http://w ...

  4. IntelliJ IDEA 2018.3.3配置 Tomcat 9,控制台出现中文乱码 “淇℃伅”(2019/01/25)

    转载:IntelliJ IDEA 2018.3.3配置 Tomcat 9,控制台出现中文乱码 "淇℃伅"(2019/01/25) - What'_up - 博客园(win10系统) ...

  5. 工作经验 2014.2.25更新

    ---------------------------------------------------------------------------------------------------- ...

  6. 【转载】时尚完美_Office_2003_SP3 3合1精简双版2014.01

    时尚完美_Office_2003_SP3 3合1精简双版2014.01 [精简说明]: 本版基于 Microsoft Office 2003 SP3 简体中文企业版并采用微软官方的Office定制工具 ...

  7. “雾霾”天里坐看云起时-【软件和信息服务】2014.01

    2013年是中国关注雾霾的元年,中国经济高速发展了30多年后,我们终于幡然醒悟:雾霾和各种污染也开始正式进入公众和各级政府的视野.VMware在12月6日召开的VSS上海站并没有因为雾霾肆虐而降低热度 ...

  8. 2014.8.25二分法,二维数组

    1 //二分法 2 //假设顶一个已经排好序的数组,用户输入一个数,找出这个数的位置,没有则返回空 3 int[] nums = new int[10] { 1, 2, 3, 4, 5, 6, 7, ...

  9. 再寄小读者之数学篇[2014.01.01-2014.06.30]

    [再寄小读者之数学篇](2014-06-28 证明级数几乎处处收敛) 设 $f\in L(\bbR)$, 试证: $$\bex \vsm{n}f(n^2x) \eex$$ 在 $\bbR$ 上几乎处处 ...

  10. 【微语】第十一周(01.25~01.31)

    1.25.我们大多数人不是为昨天懊恼,就是为明天担忧,偏偏不肯好好把握今天. 1.26.一生只有一遍,所以好好努力.时光欠你的,会在往后的日子慢慢归还. 1.27.幸福是回到家后敲门,而不是伸手去摸那 ...

最新文章

  1. php封装pdo实例以及pdo长连接的优缺点
  2. 进入DRF和ANGULAR的整合学习,这三篇入门内容一定要学好的
  3. Shadow Brokers 公布 2.1 万美元的 0day 订阅服务
  4. Distinct源码分析
  5. (10)FPGA专业术语(第2天)
  6. CentOS6.8下安装xz命令
  7. poj3557 Map Generator
  8. px 与 dp, sp换算公式?(转)
  9. web开发excel文件上传及解析(上)
  10. python中求和公式是什么函数_python中求和函数怎么用
  11. 批量打印远端PDF文件
  12. android lrc歌词解析,Android解析lrc里的歌词
  13. PostgreSQL t_bits计算方法
  14. git公钥生成以及日常操作
  15. 从redis中取值 然后通过list进行分页查询
  16. C++学习(二六六)LINK_DIRECTORIES
  17. Python爬虫可以爬取什么呢?
  18. spring4 搭建开发环境
  19. npm使用过程中的一些错误解决办法及npm常用命令
  20. 开源!用于3D激光雷达SLAM回环检测的实时词袋模型BoW3D

热门文章

  1. 【学习笔记】常见的提权方式
  2. 奇葩说第三季被删减版下载,奇葩说被禁资源下载
  3. C语言程序设计第3章节练习题
  4. 浏览器记住账号密码后,在密码输入框屏蔽浏览器的弹出提示
  5. 6、用户加入房间、离开房间提示
  6. Drools语法进阶
  7. android获取本地图片并显示图片
  8. 鸿蒙系统与5g,华为不止5G和鸿蒙系统,还握有另一张“王牌”,让对手不敢小觑...
  9. 10进制rgb转16进制rgb
  10. 世界著名化妆品官方网站