2016-09-26 80 views
2

好人,需要MySQL的幫助。嘗試了幾個在線解決方案,但可以解決問題。MySQL與GROUP BY的LIMIT(3)行的總和

我有這個簡單的表格。

name amount 
john | 150 
john | 100 
john | 100 
john | 150 
jack | 300 
jack | 100 
jack | 100 

基本上,我必須得到至少有3行(按最高金額排序)中總計爲500的用戶。 正確的答案只能返回jack,因爲只有他在3條記錄中總計500(按最高排序)。 john總共有500個,其中3個最高金額只返回400(150 + 150 + 100),所以查詢不返回john

SELECT 
*, 
SUM(amount) as sums 
FROM (SELECT * FROM transfer GROUP BY name ORDER BY amount DESC LIMIT 3) as ttl 
GROUP BY name 
HAVING sums >= 500 

它工作正常(至少沒有錯誤),但第二個選擇(括號內的一個)只返回第一行。

任何幫助,高度讚賞。

回答

1

讓我假設你有另一列是唯一的ID。那麼你可以這樣做:

select distinct t1.name 
from transfer t1 left join 
    transfer t2 
    on t1.name = t2.name and t1.id < t2.id left join 
    transfer t3 
    on t1.name = t3.name and t2.id < t3.id 
where t1.amount + coalesce(t2.amount, 0) + coalesce(t3.amount, 0) >= 500; 

這對大型表格不是非常有效。爲此,使用變量枚舉值:

select name 
from (select t.*, 
      (@rn := if(@n = name, @rn + 1, 
         if(@n := name, 1, 1) 
         ) 
      ) as rn 
     from transfer cross join 
      (select @n := '', @rn := 0) params 
     order by name, amount desc 
    ) t 
where rn <= 3 
group by name 
having sum(amount) >= 500; 

這也有它不依賴於id列的好處。