mysql 查詢每一個分組前N條記錄

mysql 查詢每一個分組前N條記錄html

假設存在表movie,  有字段 id, part(地區), mcount(觀看次數)mysql

現查詢每一個地區觀看次數最多的3部movie, 則表sql

###id雖未存在group列表 但不報錯,緣由未知…htm

select a.part,a.id, a.mcount from movie a, movie bblog

#下面的where子句產生迪卡爾積並進行篩選, 最大記錄與本身產生一條記錄(以自身數據爲key), 第二位的 將與最大的數據及自身產生兩條數據 ……以次類推
where a.part = b.part and a.mcount <= b.mcount 
group by a.part, a.mcountselect

#選出以(part, mcount)爲key的分組中不大於3的分組, 即爲所求
having count(a.part) <= 3im

 

因爲以前,未徹底理解數據含義,並未覆蓋全部狀況,作出如上結果sql,待朋友給出特殊數據後,才知存在問題。數據

上面這條語句不能處理有重複的記錄如 天津有兩個mcount爲3但id不一樣的記錄(id表示電影惟一編號, 一個電影能夠在多個城市上映,惟號同)查詢

由於若以part, 和mcount爲選擇條件時  id爲1  part天津 mcount 3  與  id爲4 part天津 mcount 3的記錄 產生的積也符合條件 ,其爲key的分組將大於3 被過濾過img

 

可用以下修正過的SQL:

select a.id, a.part, a.mcount from movie a , movie b

#####若mcount不等時產生的積爲合法, mcount相等時 判斷是否爲自身產生,如果,合法;若不是,不合法#####
where a.part = b.part
    and ((a.mcount = b.mcount and a.id = b.id) or (a.mcount < b.mcount))   
group by a.part, a.mcount, a.id   ###三個字段爲key進行分組
having count(*) <= 3
order by part, mcount desc
 

執行結果爲:

 

壞處: 自身進行迪卡爾積,若數據量大, 產生中間臨時數據將過大

 http://www.cnblogs.com/barrenlake/p/4399245.html

相關文章
相關標籤/搜索