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

在mysql表中显示每个类别中的最后2个条目

岳嘉容
2023-03-14
问题内容

我有一张表如下

===============================================
id          |      category    |    names     |
===============================================
1           |          A       |    name1     |
2           |          A       |    name2     |
3           |          A       |    name3     |
4           |          B       |    name4     |
5           |          B       |    name5     |
6           |          B       |    name6     |
7           |          B       |    name7     |
8           |          C       |    name8     |

预期输出:name8,name7,name6,name3,name2

我希望在每个类别中显示最后2个条目吗?有人请帮帮我。谢谢你的放心。


问题答案:

这些类型的结果最好由其他RDBMS中的窗口函数来处理,但是不幸的是Mysql没有任何窗口函数,因此作为替代方案,存在一种使用用户定义的变量为属于同一组的行分配等级的解决方案。

SELECT  `id`, `category`, `names`
FROM (
SELECT *,
@r:= CASE WHEN @g = category THEN @r + 1 ELSE 1 END rownum,
@g:=category
FROM test
  CROSS JOIN(SELECT @g:=NULL ,@r:=0) t
  ORDER BY category,id desc
) c
WHERE c.rownum <=2

上面的查询将为您提供每个类别2条最近记录(基于id),您可以将带where子句的查询的最后一部分更改为任意数字,以每组显示n条结果,例如,然后显示3条记录WHERE c.rownum <= 3,依此类推

Demo



 类似资料:
  • 问题内容: 可以说我有一张叫Gamers的桌子。 玩家 包含列,,。 我有兴趣选择每个游戏中得分最高的球员。 例如, 查询后,我希望获得GamerID 4、5和8的行。执行该操作的查询是什么? 问题答案: 试试这个: 这将输出: 您可以做的另一种选择是创建一个临时表或视图(如果您不喜欢子查询)。 然后: 或视图: 然后:

  • 我想检索进程的最后2个版本: 预期结果将是: 我写了这个查询,但我不喜欢它。。。我不能将它作为子查询包含在中<代码>从中选择(从中选择子字符串索引(按顺序排列(ORDER BY

  • 问题内容: 有一个包含数据的表,如下所示: 如果我运行查询,我将得到的结果为: 什么查询将返回以下结果? 即,应返回每个组中的最后一条记录。 目前,这是我使用的查询: 但这看起来效率很低。还有其他方法可以达到相同的结果吗? 问题答案: MySQL 8.0现在支持窗口功能,就像几乎所有流行的SQL实现一样。使用这种标准语法,我们可以编写每组最多n个查询: 以下是我在2009年为此问题写的原始答案:

  • 问题内容: 需要查看条形图中的条形所代表的确切值,而不是Y轴上的近似值。 怎么可能呢? 谢谢阅读! 问题答案: 在iReport 3.7.6中,您可以仅选中BarPlot属性下的“显示标签”框。 在以前的版本(3.1.4)中,我必须创建一个ChartCustomizer类。 如果您需要格式化标签中的数字(例如,设置为百分比,添加千位分隔符等),那么即使在新版本中,您也绝对需要一个ChartCust

  • 问题内容: 可以说我有2个表:blog_posts和类别。每个博客帖子仅属于一个类别,因此此处的两个表之间基本上有一个外键。 我想从每个类别中检索2个最新的帖子,是否可以在单个请求中实现?GROUP BY会将所有内容分组,而在每个类别中只剩下一行。但我要其中两个。 执行1 + N查询(N =类别数)会很容易。首先检索类别。然后从每个类别检索2个帖子。 我相信执行M个查询(M =我希望从每个类别获得

  • 我有2张桌子,有作者和书 我被告知不允许使用变量,并且如果表变得很大,我所做的工作效率会非常低。 我是不是漏掉了什么明显的东西?有没有一种方法可以在一个语句中实现这一点,而不需要变量(或临时表),并且不必对整个books表进行两次选择/分组?