栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > 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号