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