mysql先排序後判斷 mysql 排序後在查詢

2021-10-17 13:19:42 字數 980 閱讀 5270

今天寫sql 的時候,遇到乙個問題,有乙個圖書表和乙個章節表

book   chapter

我需要隨機五本書,並且獲取這五本書的最新章節和標題    ,rank代表多少章

我的sql是:

select t.* from

(select b.* ,c.rank,c.title from book b

inner join chapter c on c.bid=b.id

order by c.rank desc)as t group by t.id

匯出來的資料永遠都是第一章,而不是最後一章,後來在網上查了一下,在mysql 5.7版本一下,

這個sql是沒有問題的,但是要是版本超過》=5.7,就有問題,

mysql 5.7對子查詢進行了優化,認為子查詢中的order by可以進行忽略

那麼大於5.7的解決方法,就是:

1:select t.* from

(select b.* ,c.rank,c.title from book b

inner join chapter c on c.bid=b.id

order by c.rank desc limit 1000000)as t group by t.id

需要 設定一下查詢的個數大小,limit無窮大,這兩個sql唯一的不同就在於此

當然這個limit的最大值就是章節表的count(*)總個數

這樣執行結果就和預想的一樣了,

2:select * from chapter a where n >(select count(*) from chapter b where a.bid=b.bid and a.rank

方法1中使用limit,需要limit的範圍足夠大能包括所有資料,並且每種分類只會顯示一條資料,但是資料較多時執行效率要比方法2快上很多,方法2能夠控制每種分類顯示多少條資料,把n換成需要顯示對應的數字即可。

例如只想保留最大章節的記錄 只需要把n寫成1  就可以了

MySQL 先排序後去重

前言 近來開始寫後端,先從小bug入手,記錄下有趣的sql 1.需求 根據表中的a欄位排序,然後再根據b欄位去重 2.實現 第乙個sql語句 select distinct name from student where id 1111 order by age desc發現結果集中已去重,但是並沒...

mysql 排序優先 sql優先排序

廣告表info ad裡有在用的服務 end time沒有過期 過期的了服務,需要這樣取出前30個廣告編號 ad id 在用的服務優先取出來,如果不夠30個,就隨機取過期的服務,直到總共30個為止,廣告表info ad裡有在用的服務 end time沒有過期 過期的了服務,需要這樣取出前30個廣告編號...

MySql下實現先排序後分組

最近在工作中遇到乙個先排序後分組的需求,發現mysql不同的版本有不同的結果,特此記錄。舉例 要求在shop表中查詢出各型別商店中 最高的商品。表結構 create table shop id int 10 primary key,shop name varchar 100 item name va...