关于union的一些问题,Mysql中UNION用法与排序lom599乐百家手机:

 百家乐-数据     |      2019-11-29 05:04

创设一个测量试验数据表

   这段时间也是在写项目中遭受的那些标题,须要将七个SELECT查询结果组合起来实行分组排序,想到了用union方法,用TP的union操作根本无法实现复杂的union操作,于是搜罗了一下,先说一下union的用法,在说一下TP中什么得以实现复杂的union操作。

CREATE TABLE `temp_table` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `endtime` int(10) NOT NULL,
  `basic_sort` smallint(8) NOT NULL,
  `type` tinyint(1) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

  一、UNION 用法

对UNION 和UNION ALL 进行相比:

  一 UNION语法

在MySQL 5.1普通话手册中有下边一句话:

  SELECT ...

假诺您对UNION不行使首要词ALL,则持有重返的行都是当世无双的,就像是你曾经对整个结果集结使用了DISTINCT。倘使你钦点了ALL,您会从持有用过的SELECT语句中拿到全数相配的行。

  UNION[ALL | DISTINCT]

布置测量试验数据:

  SELECT ...

INSERT INTO `temp_table` (`name`,`endtime`,`basic_sort`,`type`) VALUES ('a', '1534349307', '10', '2');
INSERT INTO `temp_table` (`name`,`endtime`,`basic_sort`,`type`) VALUES ('a', '1534349308', '14', '2');
INSERT INTO `temp_table` (`name`,`endtime`,`basic_sort`,`type`) VALUES ('c', '1534349309', '12', '1');
INSERT INTO `temp_table` (`name`,`endtime`,`basic_sort`,`type`) VALUES ('d', '1534349310', '12', '1');

  [UNION [ALL | DISTINCT]

 lom599乐百家手机 1

  SELECT ...]

(SELECT id,name,endtime,basic_sort,type from temp_table where type=1)
UNION 
(SELECT id,name,endtime,basic_sort,type from temp_table where type=2);

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

 

  列于每一个SELECT语句的附和地点的被增选的列应具备同等的品种。(举例,被第一个语句接收的率先列应和被其余语句接纳的率先列具备同等的档期的顺序。www.111cn.net卡塔尔国在首先个SELECT语句中被选用的列名称也被用来结果的列名称。

(SELECT id,name,endtime,basic_sort,type from temp_table where type=1)
UNION ALL
(SELECT id,name,endtime,basic_sort,type from temp_table where type=2);

  SELECT语句为正规的取舍语句,可是遭到如下的范围:

 对于地点两句分别是UNION和UNION ALL组合,可是得到的结果是平等的。

  ·唯有最后一个SELECT语句能够动用INTO OUTFILE。

lom599乐百家手机 2

  ·HIGH_PCR-VIO奥迪Q3ITY无法与作为UNION黄金时代部分的SELECT语句同时接纳。倘令你对第四个SELECT内定了HIGH_P宝马7系IO福特ExplorerITY,则不会起效果。假使您对别的后续的SELECT语句钦赐了HIGH_PSportageIO奔驰M级ITY,则会生出语法错误。

实质上上面说的【全数重返的行都以唯意气风发的】这里所说的是主键唯意气风发:

  假设您对UNION不利用首要词ALL,则有所再次来到的行都以独一无二的,就像你曾经对任何结果集结使用了DISTINCT。借使你钦点了ALL,您会从全部用过的SELECT语句中拿到全部相配的行。

(SELECT id,name,endtime,basic_sort,type from temp_table)
UNION 
(SELECT id,name,endtime,basic_sort,type from temp_table);

  DISTINCT关键词是多少个自行选购词,不起任何意义,可是依照SQL标准的供给,在语法中允许接纳。(在MySQL中,DISTINCT代表叁个共用体的私下认可职业性质。卡塔尔

lom599乐百家手机 3

  您能够在同朝气蓬勃查询中混合UNION ALL和UNION DISTINCT。被混合的UNION类型遵照那样的措施比较,即DISTINCT共用体覆盖坐落于其左边手的全数ALL共用体。DISTINCT共用体能够应用UNION DISTINCT显明地生成,或选用UNION(后边不加DISTINCT或ALL关键词卡塔尔隐含地生成。

(SELECT id,name,endtime,basic_sort,type from temp_table)
UNION ALL
(SELECT id,name,endtime,basic_sort,type from temp_table);

  假若你想使用OLANDDER BY或LIMIT子句来对任何UNION结果开展分拣或约束,则应对单个地SELECT语句加圆括号,并把O中华VDER BY或LIMIT放到倒数的末尾。以下例子同一时间使用了那四个子句:

lom599乐百家手机 4

 代码如下

那边对于UNION再次回到的结果相当于对主键做贰次DISTINCT,而UNION ALL 重临的结果也就是是单纯把结果查询出来然后合并重临。

 

对UNION查询结果举办排序:

(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;   

布署测验数据(将刚刚的表内容剔除,使用TRUNCATE `temp_table`):

 (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;

INSERT INTO `temp_table` (`name`,`endtime`,`basic_sort`,`type`) VALUES ('a', '1534349307', '10', '2');
INSERT INTO `temp_table` (`name`,`endtime`,`basic_sort`,`type`) VALUES ('b', '1534349308', '14', '2');
INSERT INTO `temp_table` (`name`,`endtime`,`basic_sort`,`type`) VALUES ('c', '1534349309', '12', '2');
INSERT INTO `temp_table` (`name`,`endtime`,`basic_sort`,`type`) VALUES ('d', '1534349310', '12', '2');
INSERT INTO `temp_table` (`name`,`endtime`,`basic_sort`,`type`) VALUES ('e', '1534349311', '18', '2');
INSERT INTO `temp_table` (`name`,`endtime`,`basic_sort`,`type`) VALUES ('f', '1534349312', '18', '2');
INSERT INTO `temp_table` (`name`,`endtime`,`basic_sort`,`type`) VALUES ('aa', '1534349313', '11', '1');
INSERT INTO `temp_table` (`name`,`endtime`,`basic_sort`,`type`) VALUES ('bb', '1534349314', '11', '1');
INSERT INTO `temp_table` (`name`,`endtime`,`basic_sort`,`type`) VALUES ('cc', '1534349315', '13', '1');
INSERT INTO `temp_table` (`name`,`endtime`,`basic_sort`,`type`) VALUES ('dd', '1534349316', '12', '1');
INSERT INTO `temp_table` (`name`,`endtime`,`basic_sort`,`type`) VALUES ('ee', '1534349317', '12', '1');
INSERT INTO `temp_table` (`name`,`endtime`,`basic_sort`,`type`) VALUES ('ff', '1534349318', '15', '1');

  这种O锐界DER BY不能够使用满含表名称(也正是,接纳tbl_name.col_name格式的称号卡塔尔列援引。能够在率先个SELECT语句中提供八个列别称,并在ORubiconDER BY中参照他事他说加以考查小名,或接收列地方在O奥德赛DER BY中参阅列。(首要推荐选用小名,因为不提出选用列地方。卡塔尔(英语:State of Qatar)

lom599乐百家手机 5

  此外,假设带分类的一列有别称,则O奥迪Q5DEHighlander BY www.111cn.nEt子句必需援引别称,而无法援用列名称。以下语句中的第一个语句必需运营,然则第二个会运作退步,出以往'order clause'中有不解列'a'的谬误:

这里大家想要得到的结果是:按type的正序排序,接着按basic_sort倒叙排序

 代码如下

(select * from temp_table where type=1 ORDER BY basic_sort desc) 
union 
(select * from temp_table where type=2 ORDER BY basic_sort desc)

 

 对于那样的SQL语句得到的结果是:

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

lom599乐百家手机 6

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

与没有在子句中动用O智跑DEENCORE BY的结果相近。

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

(select * from temp_table where type=1) union (select * from temp_table where type=2)

  为了对单个SELECT使用OENCOREDER BY或LIMIT,应把子句归入圆括号中。圆括号包涵了SELECT。

 在MySQL 5.1华语手册中有下边两句话:

 代码如下

1、假诺您想选用O瑞鹰DER BY或LIMIT子句来对全部UNION结果举办归类或限定,则应对单个地SELECT语句加圆括号,并把O中华VDER BY或LIMIT放到最终三个的后面。

 

 倘使要成功地方的必要应该是:

(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);

(select *,type as sort_type,basic_sort as sort_value from temp_table) 
union 
(select *,type as sort_type,basic_sort as sort_value from temp_table) 
order by sort_type ASC,sort_value ASC

  二 实例扩张

lom599乐百家手机 7

  union能够对同二个表的若干次查询联合起来. 那样做的利润也格外确定, 举个例子在blog应用中, 可以利用一条sql语句完成置顶blog和普通blog的分页展现.

2、圆括号中用于单个SELECT语句的OTiggoDER BY唯有当与LIMIT结合后,才起效用。不然,O中华VDEEscort BY被优化去除。

 代码如下

(select * from temp_table WHERE type=1 ORDER BY basic_sort ASC LIMIT 6)
union 
(select * from temp_table WHERE type=2 ORDER BY basic_sort ASC LIMIT 6)