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

MySQL-控制分组返回的行

隆飞宇
2023-03-14
问题内容

我有一个这样的数据库表:

id    version_id    field1    field2
1     1             texta      text1
1     2             textb      text2
2     1             textc      text3
2     2             textd      text4
2     3             texte      text5

如果没有解决,它包含一行的多个版本,然后包含一些文本数据。

我想查询它,并为每个ID返回编号最高的版本。(因此,第二行和最后一行仅在上面)。

我尝试在按version_id DESC排序时尝试使用分组方式-但似乎在对其分组后进行了排序,因此这行不通。

任何人有任何想法吗?我简直不敢相信!

更新:

提出这个,它可以工作,但是使用子查询:

SELECT *
FROM (SELECT * FROM table ORDER BY version_id DESC) t1
GROUP BY t1.id

问题答案:

这称为选择列的分组最大值。这是mysql的几种不同方法。

这是我的处理方式:

SELECT *
FROM (SELECT id, max(version_id) as version_id FROM table GROUP BY id) t1
INNER JOIN table t2 on t2.id=t1.id and t1.version_id=t2.version_id

尽管mysql将在内存中为子查询创建一个临时表,但这将相对有效。我假设您已经为此表在(id,version_id)上建立了索引。

在SQL中,您或多或少必须使用子查询来解决此类问题(半连接是另一个示例),这是一个缺陷。

子查询在mysql中没有得到很好的优化,但是不相关的子查询并不是很糟糕,只要它们不是很大,它们将被写入磁盘而不是内存。假设此查询中只有两个int,则该子查询可能比该查询早几百万行,但是您的第一个查询中的select
*子查询可能会更早地遇到此问题。



 类似资料:
  • 目标是打印标签的当前文本。标签在整个程序中不断变化,使用当前的方法,我只能检索标签的初始化值。 我用来检索控制器实例的内容:

  • 我最近正在学习分而治之算法。 如果返回值假定为某个整数,我就能够解决这些问题。 例如:1。二进制搜索,这里我只需要返回1如果找到,否则-1。 例:2。数组中的最大数,只需返回一个数字。 但是当涉及到返回一个数组时,就像我们需要整个数组作为输出(Ex:排序)。 我觉得很难。 有人能帮你找到最好的方法吗? 下面是我的二进制搜索方法。

  • 你好,我是拉威尔的新手,也许这对你们来说太傻了。在laravel 8中,路由web。php我创建了一条如下的路线: 我想问的是,我们也可以从回调视图返回控制器吗?所以在路由 /editprofile中,第二个参数不是'App\Http\Controller\SiteController@edit_profile',而是一个回调函数,如路由'/home'。 但是它返回错误哈哈。假设我不想用__con

  • 问题内容: 我正在尝试创建控制器操作,该操作将根据参数返回JSON或部分html。使结果异步返回到MVC页面的最佳方法是什么? 问题答案: 在您的操作方法中,返回Json(object)以将JSON返回到您的页面。 然后只需使用Ajax调用action方法即可。您可以使用ViewPage中的一种辅助方法,例如 SomeMethod将是一个javascript方法,然后评估返回的Json对象。 如果

  • 问题内容: 有没有一种简单的方法可以将GROUP BY结果限制在前2位。以下查询返回所有结果。使用“ LIMIT 2”将整个列表减少到仅前2个条目。 结果如下: 谢谢乔恩 根据要求,我附上了表格结构和一些测试数据的副本。我的目标是创建一个视图,该视图具有每个唯一的rating_name的前2个结果 问题答案: 我认为MySQL中没有简单的方法。一种方法是通过为按rating_name分组的每一行生

  • 如果可以从Spring返回,我很好奇 这样做可以吗?我试过了,Spring返回的不是流的值。 我应该继续返回