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

为每个类别选择N条记录,并按X排序

解明辉
2023-03-14
问题内容

我有一个包含博客文章的数据库表。我想在首页上显示每个类别的一则(或更多)帖子,例如按日期排序。

所以我的posts表看起来像这样: id | title | description | cat | filename | date

我将如何创建这样的查询?我曾经考虑过使用group-by或subselect,但是我不确定这是否对性能有好处…该表具有大量记录。


问题答案:

MySQL 支持解析功能(ROW_NUMBER,RANK,DENSE_RANK,NTILE …),但是您可以使用变量模拟功能。

如果要 N条 最新博客文章:

SELECT x.id,
       x.title,
       x.description,
       x.cat,
       x.filename,
       x.date
  FROM (SELECT bp.id,
               bp.title,
               bp.description,
               bp.cat,
               bp.filename,
               bp.date,
               CASE 
                 WHEN bp.cat = @category THEN @rownum := @rownum + 1
                 ELSE @rownum := 1
               END AS rank,
               @category := bp.cat
          FROM BLOG_POSTS bp
          JOIN (SELECT @rownum := 0, @category := NULL) r
      ORDER BY bp.cat, bp.date DESC) x
 WHERE x.rank <= N

如果您希望等级1最早的博客文章,请将ORDER BY更改为:

ORDER BY bp.cat, bp.date


 类似资料:
  • 问题内容: 我正在尝试获取前N条记录(当按某些X列排序时),但结果设置却相反。以下语句是 不正确的 ,但可能说明了我的追求: 例如,列X可以是ID或时间戳;我想要最新的10条记录,但希望它们按时间先后顺序返回。 问题答案: 也就是说,您可能需要在子查询上使用别名,但除此之外,别名应该可以使用。

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

  • 问题内容: 是否有更好的方法从MySQL表中获取多个“前X个”结果?当不同的 foo 的数量很少时,我可以通过联合轻松地完成此操作: 我显然可以继续为foo的每个值添加联合。但是,当foo有500多个不同的值并且我需要每个值的前X个时,这是不切实际的。 问题答案: 这种查询可以用“每组最大n”来表述,您希望每个“组”的前10个得分为“ foo”。 我建议您看一下这个链接,它很好地处理了这个问题,从

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

  • 问题内容: 我们是postgres的新手,我们有以下查询,通过该查询我们可以从每个类别中选择前N个记录。 以上查询的输出是这样的 但是我们的要求有所不同,我们想从每个类别中选择前n%个记录,其中n不固定,n基于每个组中某些元素的百分比。 问题答案: 要基于每个组中行数的百分比来检索行,可以使用两个窗口函数:一个对行进行计数,另一个对行赋予唯一编号。 SQLFiddle示例:http ://sqlf

  • 问题内容: 我有一个带有表的数据库,看起来像这样: 有数十万条记录。每个可以在7个不同的表之一中,对应于一个表: 我想要一个从每个类别中选择1个随机项目的查询。解决这个问题的最佳方法是什么?我知道使用和用于类似的随机查询,但是我从未做过这样的事情。 问题答案: 此查询以随机顺序返回加入类别的所有项目: 要将每个类别限制为一个类别,请将查询包装在 partial中 : 请注意,当查询同时具有and