MySQL中union和order by一起使用的不排序問題

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都必須要保證聯合的兩個字段數一樣,字段可以不同。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章