您的位置:首页 > 数据库 > MySQL

MySQL中union和order by一起使用的不排序问题

2020-07-14 06:23 239 查看

MySQL中union和order by一起使用的不排序问题

背景描述:

这里有一张sc的表,有三个字段,s(学号),c(课程号),score(课程成绩),数据结构如下:

创建表的sql语句如下:
create table sc1(
s varchar(10),
c varchar(10),
score decimal(18,1))
ENGINE=INNODB CHARSET=utf8;


现在在表中插入数据:

插入数据的sql语句如下:
insert into sc values
('01','01','80'),
('01','02','90'),
('01','03','99'),
('02','01','70'),
('02','02','60'),
('02','03','80'),
('03','01','80'),
('03','02','80'),
('03','03','80'),
('04','01','50'),
('04','02','30'),
('04','03','20'),
('05','01','76'),
('05','02','87'),
('06','01','31'),
('06','03','34'),
('07','02','89'),
('07','03','98')

题目描述

我们将sc表中的数据,按照不同的课程(c)分开排列,并且按照成绩排序生成序号。
思路分析:因为这里要按照不同的课程编号进行排列,我们可以使用where条件先将不同课程中数据筛选出来成一张表,然后在这张表中使用order排序,并且添加伪列生成序号,最后将三种表联合。
方法1:

(SELECT (@rowNO1 := @rowNo1 + 1 ) AS rowno1,a.*
FROM(SELECT * FROM sc) a,(SELECT @rowNO1 := 0) b
where a.c=01 ORDER BY a.score desc limit 10000 )
UNION
(SELECT (@rowNO2 := @rowNo2 + 1 ) AS rowno2,a.*
FROM(SELECT * FROM sc) a,(SELECT @rowNO2 := 0) b
where a.c=02 ORDER BY a.score desc limit 10000 )
UNION
(SELECT(@rowNO3 := @rowNo3 + 1 ) AS rowno3,a.*
FROM(SELECT * FROM sc) a,(SELECT @rowNO3 := 0) b
where a.c=03 ORDER BY a.score desc limit 10000);

方法二:

SELECT * from (SELECT (@rowNO1 := @rowNo1 + 1 ) AS rowno1,a.*
FROM(SELECT * FROM sc) a,(SELECT @rowNO1 := 0) b
where a.c=01 ORDER BY a.score desc) t1
UNION
SELECT * from (SELECT (@rowNO2 := @rowNo2 + 1 ) AS rowno2,a.*
FROM(SELECT * FROM sc) a,(SELECT @rowNO2 := 0) b
where a.c=02 ORDER BY a.score desc) t2
UNION
SELECT * from (SELECT(@rowNO3 := @rowNo3 + 1 ) AS rowno3,a.*
FROM(SELECT * FROM sc) a,(SELECT @rowNO3 := 0) b
where a.c=03 ORDER BY a.score desc) t3;

遇见问题描述

我在做这个题目的时候发现,针对方法一,如果不加limit这里的order by是没有生效的,所以在使用union进行多表联合查询的时候,需要按结果对某一个字段进行分页的时候,需要添加limit(分页)每个字句的order by才会生效;
针对方法二,这里主要是针对union里面的每一个子查询的结果集,要把这个结果集当成一张独立的表(在外部再使用select*from),再使用union。

知识补充:
union与union all:
1、union和union all的区别,union会去掉相同的记录,但是union all是简单的将两张表合并在一起;
2、union、union all都必须要保证联合的两个字段数一样,字段可以不同。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: