需求:有一张linkman表,查询结果分为三个部分,第一个部分id为6、8、9的按照年龄降序,第二部分第一部分剩余的人且id∈[8,15],按年龄降序排序,剩余的为第三部分,按年龄降序排序。
数据库的表结构如下:

-- Create Table
CREATE TABLE `linkman` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL,
  `sex` varchar(50) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `address` varchar(50) DEFAULT NULL,
  `qq` varchar(50) DEFAULT NULL,
  `email` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=42 DEFAULT CHARSET=utf8

思路是:三部分分别写出来select语句,然后用union all连接一起来。
遇到的问题:
1.如果在union/union all自语句中使用了order by,子语句就要用小括号括起来,否则就会报错。
2.在使用union/union all的时候order by失效。
SQL语句

(SELECT 
	id,NAME,sex,age,address,qq,email,age
	linkman
WHERE 
	id IN (8,9,6)
ORDER BY 
	age DESC)
UNION ALL 
(SELECT 
	id,NAME,sex,age,address,qq,email,age
	linkman
WHERE 
	id IN (8,10,11,12,14,15)
ORDER BY 
	age DESC)
UNION ALL 
(SELECT 
	id,NAME,sex,age,address,qq,email,age
	linkman
WHERE 
	id NOT IN (6,8,9,10,11,12,13,14,15)
ORDER BY 
	age DESC)

执行结果如下:
在这里插入图片描述
通过执行结果发现,结果是按照了要求分成了三个部分,但是每个部分并没有进行排序。
在网上看到的两个方法:
1.只在最终结果后面加上order by (并不能解决问题,原有的分部分会被打乱)。
2.union/union all子语句不能直接用order by 但他们子语句的子语句可以使用。大致意思就是将子语句的查询结果当作select 查询的表。(不能解决问题)

最终解决方案:
在子语句中使用limit,SQL语句如下:

(SELECT 
	id,NAME,sex,age,address,qq,email,age
	linkman
WHERE 
	id IN (8,9,6)
ORDER BY 
	age DESC
LIMIT 
	1000)
UNION ALL 
(SELECT 
	id,NAME,sex,age,address,qq,email,age
	linkman
WHERE 
	id IN (8,10,11,12,14,15)
ORDER BY 
	age DESC
LIMIT
	1000)
UNION ALL 
(SELECT 
	id,NAME,sex,age,address,qq,email,age
	linkman
WHERE 
	id NOT IN (6,8,9,10,11,12,13,14,15)
ORDER BY 
	age DESC
LIMIT
	1000)

执行结果如下:
在这里插入图片描述
执行结果不仅分成了三部分,每部分还都根据年龄降序,结果达到预期。
对于limit的数字可以通过设置变量+count()动态设置。
这样的方法有点治标不治本,如果有更好的方法欢迎评论~

需求:有一张linkman表,查询结果分为三个部分,第一个部分id为6、8、9的按照年龄降序,第二部分第一部分剩余的人且id∈[8,15],按年龄降序排序,剩余的为第三部分,按年龄降序排序。表结构如下:-- Create TableCREATE TABLE `linkman` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT NULL, `sex` varchar(50) DEFAULT NULL, ` 1、如果直接用如下sql语句是会报错:Incorrect usage of UNION and ORDER BY。 SELECT * FROM t1 WHERE username LIKE 'l%' ORDER BY score ASC UNION SELEC...
unionunion all的区别 两个查询的结果集必须拥有相同的列数和相同的数据类型。 UNIONUNION ALL 操作的结果集的列名和数据类型是根据第一个查询的结果集来决定的,因此如果第一个查询的列名或数据类型发生变化,后续查询的结果集也会相应地发生变化。 如果想要在 UNION 使用 ORDER BY 对结果集进行排序,需要将 ORDER BY 子句放在最后一个查询语句的后面。这是因为 ORDER BY 对整个结果集进行排序,而最后一个查询的结果集是最终结果集的一部分,只有在最后一个查询的结果集确定之后才能进行排序
# union all order by 排序问题order by 只可以存在 在最后一个子句 对全部的结果集排序 # 如果想要 对 各个子句排序,需要 对各个子句 order by 之后 作为新的 临时表 再 union all # SELECT * FROM # ( SELECT * FROM t1 ORDER BY 字段A limit 0, 1000 ) newt1 ## 一定要对表重新命名,否则报错 # UNION # SELECT * FROM # ( SELECT * FROM t.
(select t2.goods_id  goods_id from 1dcq_goods t2 order by t2.goods_id desc ) 如上sql语句,结果如下,可以看出是没有顺序的: 下面语句: 遇到的问题: 一个sqlunion了几个子查询。单独执行每个子查询都没问题,但union后执行,报 ORA-00904: "xxx": invalid identifier 关于union的使用: SQL: UNION Query: http://www.techont... AND aa.area_id = 'd61523dda339441f80008634c6b91f60' AND aa.type = '3' AND to_days( create_time ) = to_days( now()) ORDER BY CAS... SELECT user_id, CREATE_TIME, shop_id FROM large_fore_credit_apply_record WHERE shop_id = '2000043' UNION ALL SELECT user_id, CREATE_TIME, shop_id FROM large_apply_credit_record WHERE shop_id = '2000043' UNION ALL SELECT user (select * from order_bj order by create_time asc) t1 union all (select * from order_sh order by create_time desc) t2 t1排序正常,t2排序异常 问题分析: union 是先排序后去重,合并结.
MySQLUNIONUNION ALL是两个不同的操作符,用于将多个SELECT语句的结果合并成一个结果集。 UNION操作符会将多个SELECT语句的结果合并,并去除其的重复行。例如,如果有两个SELECT语句的结果有相同的行,那么在使用UNION操作符后,只会保留其的一个。 UNION ALL操作符也将多个SELECT语句的结果合并,但不去除其的重复行。这意味着,如果有两个SELECT语句的结果有相同的行,在使用UNION ALL操作符后,会将它们都保留下来。 下面是一个示例,说明两个操作符之间的不同之处: 假设我们有两个表,一个表名为table1,包含id和name两列,另一个表名为table2,也包含id和name两列。假设这两个表都有一行相同的数据,如下所示: table1: | id | name | |----|------| | 1 | John | | 2 | Mary | | 3 | Bob | table2: | id | name | |----|------| | 4 | John | | 5 | Alice| | 6 | Bob | 使用UNION操作符,可以将两个表的数据合并,并去除其的重复行,如下所示: SELECT * FROM table1 UNION SELECT * FROM table2; | id | name | |----|------| | 1 | John | | 2 | Mary | | 3 | Bob | | 5 | Alice| 可以看到,重复的行被去除了。 使用UNION ALL操作符,可以将两个表的数据合并,并保留其的重复行,如下所示: SELECT * FROM table1 UNION ALL SELECT * FROM table2; | id | name | |----|------| | 1 | John | | 2 | Mary | | 3 | Bob | | 4 | John | | 5 | Alice| | 6 | Bob | 可以看到,重复的行被保留了。
maven打包报错:Please refer to XXX/target/surefire-reports for the individual test results. 以及跳过test打包 13900