首先昧绣,先明確一下問題,所謂求分組的最值意思的就是在sql里面使用group by之后,每個分組有多條數(shù)據(jù)缺猛,我們要根據(jù)一定條件取其中最大的一條或者多條!
先看一個數(shù)據(jù)表 blogs 結構椭符,簡單說一下荔燎,cat_id 就是分類ID,可以看到一個分類有多條記錄:
舉個非常典型的問題:
1.求某個分類ID下销钝,查看次數(shù)最多的3條數(shù)據(jù)有咨?這個問題很簡單,基本上大家都能寫出來這樣的sql:
select * from blogs where cat_id = $cat_id order by view_num desc limit 3;
2.求多個分類ID下蒸健,查看次數(shù)最多的3條數(shù)據(jù)呢摔吏?這個問題就在于求多個,也就是我要批量查詢纵装,不能一個個查征讲,有很多人圖省事就直接for循環(huán)一個個查了,如果說只有幾個ID這樣做還可以,如果有幾十個這樣的數(shù)據(jù)就意味著幾十次的查庫操作橡娄,對性能影響還是挺大的诗箍,所以必須想辦法!
sql如下:
select SUBSTRING_INDEX(GROUP_CONCAT(cat_id,'-',id ORDER BY view_num),',',3) from blogs where cat_id in(1,2,3,4) GROUP BY cat_id
這條語句看上去比較復雜挽唉,不要慌滤祖,SUBSTRING_INDEX 是內置函數(shù),功能類似于PHP里面的 substr瓶籽,在這意思是取前3個數(shù)據(jù)匠童,重點是 group_concat, 這個函數(shù)很多人都用過,但是我估計很多人都不知道后面還可以寫 order by塑顺,所以這條sql的意思就是在每個分組里面排序取前3個汤求。
但是取出來的數(shù)組格式并不好看俏险,是以 cat_id-id 這種形式取出來的,可以看到有多個:
后面的操作只能拿到代碼里面處理了扬绪,可能需要循環(huán)取出所有id竖独,然后批量獲取數(shù)據(jù),最后再拼接出來想要的數(shù)據(jù)挤牛!雖然比較麻煩莹痢,在代碼里面需要多出很多次for循環(huán)操作,但是相比于多查幾十次庫墓赴,這點代碼運行開銷還是很小的竞膳!