MYSQL中UNION/UNION ALL与ORDER BY不能公用问题

需求:有一张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
FROM 
	linkman
WHERE 
	id IN (8,9,6)
ORDER BY 
	age DESC)
UNION ALL 
(SELECT 
	id,NAME,sex,age,address,qq,email,age
FROM 
	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
FROM 
	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
FROM 
	linkman
WHERE 
	id IN (8,9,6)
ORDER BY 
	age DESC
LIMIT 
	1000)
UNION ALL 
(SELECT 
	id,NAME,sex,age,address,qq,email,age
FROM 
	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
FROM 
	linkman
WHERE 
	id NOT IN (6,8,9,10,11,12,13,14,15)
ORDER BY 
	age DESC
LIMIT
	1000)

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

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值