mysql分組排序,取每組第一條數(shù)據(jù)

環(huán)境

MySQL:5.7

SQL語句的寫法:

select * from (select distinct(a.id) tid, a.* from template_detail a
               where a.template_id in (3, 4)
              order by a.id desc) tt
group by tt.template_id;

思路:先進行排序访递,然后再進行分組晦嵌,獲取每組的第一條。

Q: 為什么要寫distinct(a.id)呢拷姿?
A:防止合并的構(gòu)造(derived_merge)惭载;

什么是derived_merge?

derived_merge指的是一種查詢優(yōu)化技術(shù)响巢,作用就是把派生表合并到外部的查詢中描滔,提高數(shù)據(jù)檢索的效率。這個特性在MySQL5.7版本中被引入踪古,可以通過如下SQL語句進行查看/開啟/關閉等操作含长。

上面雖然聽起來感覺很牛逼的樣子,但是實際情況是伏穆,這個新特性拘泞,不怎么受歡迎,容易引起錯誤枕扫。

可以通過在子查詢中使用任何阻止合并的構(gòu)造來禁用合并陪腌,盡管這些構(gòu)造對實現(xiàn)的影響并不明確。 防止合并的構(gòu)造對于派生表和視圖引用是相同的:

  1. 聚合函數(shù)( SUM() 烟瞧, MIN() 诗鸭, MAX() , COUNT()等)
  2. DISTINCT
  3. GROUP BY
  4. HAVING
  5. LIMIT
  6. UNION或UNION ALL
  7. 選擇列表中的子查詢
  8. 分配給用戶變量
  9. 僅引用文字值(在這種情況下参滴,沒有基礎表)
子查詢order by失效的場景:
select * from (select a.* from template_detail a
               where a.template_id in (3, 4)
              order by a.id desc) tt
group by tt.template_id;

假設我們現(xiàn)在把sql中的distinct(a.id) tid,去掉强岸,會發(fā)現(xiàn)子查詢(或者叫:臨時表)中的order by a.id desc失效了。

為什么會這樣呢卵洗?

原理分析:

我們這里使用了臨時表排序请唱,繼而對其結(jié)果進行分組,結(jié)果顯示失敗过蹂,加了distinct(a.id) tid,后結(jié)果正確十绑,原因是因為臨時表(派生表derived table)中使用order by且使其生效,必須滿足三個條件:

  1. 外部查詢禁止分組或者聚合
  2. 外部查詢未指定having酷勺, order by
  3. 外部查詢將派生表或者視圖作為from句中唯一指定源
不滿足這三個條件本橙,order by會被忽略。

一旦外部表使用了group by脆诉,那么臨時表(派生表 derived table)將不會執(zhí)行filesort操作(即order by 會被忽略)甚亭。之后我使用了limit可以使其生效,原因是因為要使派生表order by生效击胜,派生表可以通過使用group by亏狰、limit、having偶摔、distinct等等使其生效(方法有好多暇唾,詳情可看文檔https://dev.mysql.com/doc/refman/5.7/en/derived-table-optimization.html


原文鏈接:
https://blog.csdn.net/u013066244/article/details/116461584

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市辰斋,隨后出現(xiàn)的幾起案子策州,更是在濱河造成了極大的恐慌,老刑警劉巖宫仗,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件够挂,死亡現(xiàn)場離奇詭異,居然都是意外死亡藕夫,警方通過查閱死者的電腦和手機孽糖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來汁胆,“玉大人梭姓,你說我怎么就攤上這事∧勐耄” “怎么了誉尖?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長铸题。 經(jīng)常有香客問我铡恕,道長,這世上最難降的妖魔是什么丢间? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任探熔,我火速辦了婚禮,結(jié)果婚禮上烘挫,老公的妹妹穿的比我還像新娘诀艰。我一直安慰自己柬甥,他們只是感情好,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布其垄。 她就那樣靜靜地躺著苛蒲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪绿满。 梳的紋絲不亂的頭發(fā)上臂外,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天,我揣著相機與錄音喇颁,去河邊找鬼漏健。 笑死,一個胖子當著我的面吹牛橘霎,可吹牛的內(nèi)容都是我干的蔫浆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼姐叁,長吁一口氣:“原來是場噩夢啊……” “哼克懊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起七蜘,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤谭溉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后橡卤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扮念,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年碧库,在試婚紗的時候發(fā)現(xiàn)自己被綠了柜与。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡嵌灰,死狀恐怖弄匕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情沽瞭,我是刑警寧澤迁匠,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站驹溃,受9級特大地震影響城丧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜豌鹤,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一亡哄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧布疙,春花似錦蚊惯、人聲如沸愿卸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽擦酌。三九已至,卻和暖如春菠劝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背睁搭。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工赶诊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人园骆。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓舔痪,卻偏偏與公主長得像,于是被迫代替她去往敵國和親锌唾。 傳聞我的和親對象是個殘疾皇子锄码,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容