好人,需要对MySQL有所帮助。在线尝试了一些解决方案,但可以做到正确。
我有这个简单的表格。
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
它工作正常(至少没有错误),但第二个选择(括号内的那个)只返回第一行。
非常感谢任何帮助。
答案 0 :(得分: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
列。