Mysql中UNION用法与排序

   最近也是在写项目中碰到的这个问题,需要将两个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;
时间: 2024-05-11 11:19:42

Mysql中UNION用法与排序的相关文章

详解MySQL中UNION的用法_Mysql

如果想选择其他几个表中的行或从一个单一的表作为一个单独的结果集行的几个集会,那么可以使用的UNION. UNION在MySQL4.0以上版本才能可以使用.本节说明如何使用它. 假设有两个表,潜在和实际的客户列表,供应商购买耗材合并所有三个表中的姓名和地址,来创建一个单一的邮件列表.UNION提供了一种方法做到这一点.假设三个表有以下内容: mysql> SELECT * FROM prospect; +---------+-------+------------------------+ | f

MySQL中Union子句不支持order by的解决方法_Mysql

本文实例讲述了MySQL中Union子句不支持order by的解决方法.分享给大家供大家参考,具体如下: 我对DB知之甚少,这问题只在MySQL遇到,不知道别的DBMS是不是也如此. 问题是这样的,我打算在一个表里获得与某一行记录相邻的两行,并且想通过union一起取出来,所以这么写: select id,title from subjects where id>#some_id# order by id limit 1 union select id,title from subjects

MySQL中union和order by同时使用的实现方法_Mysql

MySQL中union和order by是可以一起使用的,但是在使用中需要注意一些小问题,下面通过例子来说明.首先看下面的t1表. 1.如果直接用如下sql语句是会报错:Incorrect usage of UNION and ORDER BY. SELECT * FROM t1 WHERE username LIKE 'l%' ORDER BY score ASC UNION SELECT * FROM t1 WHERE username LIKE '%m%' ORDER BY score A

MySQL中对查询结果排序和限定结果的返回数量的用法教程_Mysql

MySQL Order By 查询结果排序ORDER BY SQL 语法中 ORDER BY 关键字用于对查询结果进行排序. 排序分为升序(ASC)和降序(DESC)两种,当不使用 ORDER BY 指定排序方式时,默认为升序. 语法: SELECT column,- FROM tb_name ORDER BY column1,column2,- DESC(ASC) ORDER BY 后面必须列出排序的字段名,可以是多个字段. 对 user 表 uid 进行降序查询: SELECT uid,us

mysql中explain用法详解_Mysql

如果在select语句前放上关键词explain,mysql将解释它如何处理select,提供有关表如何联接和联接的次序. explain的每个输出行提供一个表的相关信息,并且每个行包括下面的列: 1,id   select识别符.这是select的查询序列号.2,select_type 可以为一下任何一种类型simple  简单select(不使用union或子查询)primary   最外面的selectunion    union中的第二个或后面的select语句dependent uni

MySQL中union和join语句使用区别的辨析教程_Mysql

union和join是需要联合多张表时常见的关联词,具体概念我就不说了,想知道上网查就行,因为我也记不准确. 先说差别:union对两张表的操作是合并数据条数,等于是纵向的,要求是两张表字段必须是相同的(Schema of both sides of union should match.).也就是说如果A表中有三条数据,B表中有两条数据,那么A union B就会有五条数据.说明一下union 和union all的差别,对于union如果存在相同的数据记录会被合并,而union all不会合

MySql中varchar,char类型排序CAST CONVERT

简单说一下MySQL的varchar排序问题,引以为戒. 示例表结构: 先来看一下,我的表结构  代码如下 复制代码 show create table cardserver G *************************** 1. row *************************** Table: cardserver Create Table: CREATE TABLE `cardserver` ( `id` int(11) NOT NULL default '0', `v

MySQL中按照多字段排序及问题解决_Mysql

因为在做一个项目需要筛选掉一部分产品列表中的产品,使其在列表显示时排在最后,但是所有产品都要按照更新时间排序. 研究了一下系统的数据库结构后,决定将要排除到后面的产品加为粗体,这样在数据库中的"ifbold"就会被标记为1,而其他产品就默认标记为0,然后就打算使用MySQL在Order By时进行多字段排序. Order by的多条件分割一般使用英文逗号分割,所以我测试的SQL如下: 复制代码 代码如下: select * from {P}_product_con where $scl

mysql中auto_increment用法详解

auto increment mysql的自增步长可以通过下面的命令查询, mysql> SHOW VARIABLES LIKE 'auto_inc%'; +--------------------------+-------+ | Variable_name            | Value | +--------------------------+-------+ | auto_increment_increment | 1     | | auto_increment_offset