当前位置: 首页 > 面试题库 >

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

酆茂才
2023-03-14
问题内容

是否有更好的方法从MySQL表中获取多个“前X个”结果?当不同的 foo 的数量很少时,我可以通过联合轻松地完成此操作:

(SELECT foo,score FROM tablebar WHERE (foo = 'abc') ORDER BY score DESC LIMIT 10) 
UNION 
(SELECT foo,score FROM tablebar WHERE (foo = 'def') ORDER BY score DESC LIMIT 10)

我显然可以继续为foo的每个值添加联合。但是,当foo有500多个不同的值并且我需要每个值的前X个时,这是不切实际的。


问题答案:

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

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

set @num := 0, @foo := '';
select foo, score
from (
   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 BY foo, score DESC)抓住fooscore从该表中,由第一排序foo,然后评分降序。

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

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

注意:

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



 类似资料:
  • 问题内容: 我试图从看起来像这样的数据库表结果中选择前2条记录 我试过这个查询 但是有些主题,例如失踪的地方,我什至尝试了以下链接的建议 如何选择每个组的前N行? 但是我为每个受检者得到两个以上 我究竟做错了什么? 问题答案: 您可以使用相关的子查询: 该查询通过串联三列来构造单列主键。如果您有真正的主键(如),则可以用代替。 SQL Fiddle中的示例。

  • 问题内容: 我有一张桌子,我想在该表格的基础上从每个组中获取前N个项目。如果我设置了那将从每个组中选择第一行,或者如果我设置了那那将从每个组中选择前5行。请帮我。 问题答案: 有多种方法可以做到这一点。这是一个使用相关子查询的查询:

  • 问题内容: 我有一个包含博客文章的数据库表。我想在首页上显示每个类别的一则(或更多)帖子,例如按日期排序。 所以我的posts表看起来像这样: 我将如何创建这样的查询?我曾经考虑过使用group-by或subselect,但是我不确定这是否对性能有好处…该表具有大量记录。 问题答案: MySQL 不 支持解析功能(ROW_NUMBER,RANK,DENSE_RANK,NTILE …),但是您可以使

  • 问题内容: 嗨,我是Spark SQL的新手。我有一个这样的数据框。 我想为每个列表器在Spark sql中选择前10个时间戳值。 我尝试了以下查询。它引发错误。 我想为每个列表器选择我需要采用的前10个时间戳值。任何帮助将不胜感激。 问题答案: 这不行吗? 编辑: 哦,我明白了。您要:

  • 问题内容: 我有一个带有记录的表,并且有一个名为的行。我插入了太多文章,并且我只希望从每个类别中选择两篇文章。 我试图做这样的事情: 我创建了一个视图: 然后我创建了这个查询: 但这不起作用,只给我两个记录吗? 问题答案: LIMIT仅停止语句返回的结果数。您正在寻找的通常称为分析/窗口/排序功能-MySQL不支持,但您可以使用变量进行仿真: 如果不进行更改,则结果集将包含和值-如果不是这种情况,

  • 问题内容: 我有一个具有“约会表”和“服务表”的数据库。每个appt都有一个服务,每个服务都有一个价格。我想要的是一个查询,该查询将始终返回12行(每月一行),并包含几个月的总和(基于其服务ID)。到目前为止,我有: 当前,返回的内容如下: 问题是,如果一个月没有任何订单,我不会在查询中返回该月。我希望该月有一个记录,只是它的“ monthly_total”等于零。 以下是我希望查询返回的内容: