mysql 子查詢 排序 MySQL的子查詢中排序

2021-10-22 03:47:11 字數 1350 閱讀 6050

起因

create table reading_record (

id int primary key auto_increment,-- 自增主鍵

file varchar(255),-- 閱讀檔名

user varchar(255),-- 讀者

expend int,-- 閱讀時長

time datetime,-- 閱讀時間

一開始我寫了下面的sql去實現這個功能:

為了證明這個sql寫的有問題, 我使用下面的這個sql去進行校驗.

查詢結果**現多條實際的每組最後一次記錄id!=以為的每組最後一次記錄id.

解決方法

使用組內排序

網上搜尋之後發現, 排序的order by是在分組group by之後. 所以首先要做組內排序, 然後再進行分組才能得到正確的結果.

基於上面的方法, 寫了下面的sql.

結果發現:子排序中不管是以desc方式排序還是以asc方式排序, 結果都是一樣的

為了排除錯誤, 我在查詢結果字段前面都加上了temptable. 如max(temptable.id), 發現並沒有什麼作用.

mysql以及mariadb的特性

查了很長時間之後, 終於在乙個年限比較新的文章裡看到了: 新版本的mysql或者mariadb會自動忽略subquery的排序

具體的mysql版本我記不清了.

為了驗證這個說法, 我使用了以下的sql:

-- 以id逆序輸出

select * from (select * from reading_record order by id desc) as temptable;

-- 以id正序輸出

select * from (select * from reading_record order by id) as temptable;

經過驗證發現結果仍然是id正序輸出的記錄, 所以我這個版本的mysql會忽略subquery的排序.

解決subquery忽略排序

為了實現subquery可以排序, 新增limit限制.

通過給subquery的最後加上limit限制來實現subquery的排序.

-- 為了讓子查詢可以查到所有的結果, 所以把limit的值設定到非常大

select * from (select * from reading_record order by id desc limit 0, 154785445745657996) as temptable;

以上解決了所有的問題, 所欲最終通過下面的sql實現了我最開始的需求.

參考文獻

( sql優化:組內排序取最大值 )[

(mysql group by 組內排序)[

mysql中IN子查詢排序

這幾天做乙個查詢,需要在乙個指定的結果集中進行查詢,例如 select from table name where doc id in 1dba c20a 907b 其中in子句中的doc id列表是通過呼叫乙個外部介面獲得一組doc id常量列表,然後在本地庫中搜尋符合這個列表的資料 記錄。後來發...

mysql求和 子查詢 MySQL子查詢

到現在為止,我們已經表明,以select宣告是乙個簡單的查詢。該單個語句從單個資料庫表中檢索資料。sql還同意建立乙個子查詢。即巢狀在其他查詢的查詢。下列實施例給出巢狀查詢。一種表示訂單資訊儲存,包含訂單號,客戶id。訂購日期。例如以下所看到的 一張表示儲存訂單物品資訊,例如以下 另一張表儲存的是客...

mysql子查詢應用案例 MySQL子查詢

mysql子查詢 子查詢 sub query,查詢是在某個查詢結果之上進行的,一條select語句內部包含了另外一條select語句。分類子查詢有兩種分類方式,分別為 按按結果分類和位置分類。按結果分類,即根據子查詢得到的資料進行分類 理論上,任何乙個查詢結果都可以理解為乙個二維表 分別為 標量子查...