栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

MySQL为表中的每个人选择前X条记录

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

MySQL为表中的每个人选择前X条记录

这种查询可以用“每组最大n”来表述,您希望每个“组”的前10个得分为“ foo”。

我建议您看一下这个链接,它很好地处理了这个问题,从一种有意义的方式开始执行您的查询并逐步优化它。

set @num := 0, @foo := '';select foo, scorefrom (   select foo, score,      @num := if(@foo = foo, @num + 1, 1) as row_number,      @foo := foo as dummy  from tablebar  where foo IN ('abc','def')  order by foo, score DESC     ) as x where x.row_number <= 10;

如果您想在 所有 级别上执行此操作

foo
(即,假设执行
GROUP BY foo
),则可以省略该
where foo in ...
行。

基本上,内部查询(

SELECt foo, score FROM tablebar WHERe foo IN ('abc','def') ORDER BYfoo, score DESC
)抓住
foo
并
score
从该表中,由第一排序
foo
,然后评分降序。

在

@num := ...
刚刚增加的每一行,重置为1的每个新值
foo
。也就是说,
@num
仅是行号/行数(尝试自行运行内部查询以了解我的意思)。

然后,外部查询选择行/行数小于或等于10的行。

注意:

您的原始查询

UNIOn
会删除重复项,因此,如果前10个分数
foo='abc'
全为100,则仅返回一行(因为该
(foo,score)
对重复了10次)。这将返回重复项。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/432896.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号