MySQL按分组选择最大记录

MySQL按分组选择最大记录,mysql,group-by,max,Mysql,Group By,Max,我试图在一个表中创建一个查询,该表包含大约500000条记录和大约50或60列。我需要的是将这些记录整理成组,并选择每组中的最大记录 为了简化这个问题,我有一个如下的表格 +----+-------------+----------+--------+ | id | external_id | group_id | mypath | +----+-------------+----------+--------+ | 1 | 1003 | 1 | a |

我试图在一个表中创建一个查询,该表包含大约500000条记录和大约50或60列。我需要的是将这些记录整理成组,并选择每组中的最大记录

为了简化这个问题,我有一个如下的表格

+----+-------------+----------+--------+
| id | external_id | group_id | mypath |
+----+-------------+----------+--------+
|  1 |        1003 |        1 | a      | 
|  2 |        1004 |        2 | b      | 
|  3 |        1005 |        2 | c      | 
+----+-------------+----------+--------+
select * from temp GROUP BY group_id
简单的分组方式如下所示

+----+-------------+----------+--------+
| id | external_id | group_id | mypath |
+----+-------------+----------+--------+
|  1 |        1003 |        1 | a      | 
|  2 |        1004 |        2 | b      | 
|  3 |        1005 |        2 | c      | 
+----+-------------+----------+--------+
select * from temp GROUP BY group_id
返回

+----+-------------+----------+--------+
| id | external_id | group_id | mypath |
+----+-------------+----------+--------+
|  1 |        1003 |        1 | a      | 
|  2 |        1004 |        2 | b      | 
+----+-------------+----------+--------+
不错,但不是我想要的。我想要的是每组中最大输入id的完整记录。换句话说

+----+-------------+----------+--------+
| id | external_id | group_id | mypath |
+----+-------------+----------+--------+
|  1 |        1003 |        1 | a      | 
|  3 |        1005 |        2 | c      | 
+----+-------------+----------+--------+
不知何故,我希望在这里放一个max(external_id)语句来过滤需要的内容,但到目前为止,我所有的调查都失败了。请提供一些指导。当返回max(外部id)时,由于路径列不同,所以选择整个记录是很重要的。

详细信息请参见

在MySQL中,这一直是一个恼人的问题。有很多方法可以解决这个问题,比如将几个字段连接在一起(从外部_id开始),然后选择其中的MAX(),然后将其重新拆分

我建议您使用派生表。第一个表(t1)是从一个简单的查询中派生出来的,在这个查询中,您标识了
MAX(external\u id)
,然后从该表中加入以获取其余的数据

仅当
外部\u id
是唯一的

SELECT 
   t1.group_id, some_table.id, some_table.mypath
FROM 
   (
      SELECT group_id, MAX(external_id) AS external_id
      FROM some_table
      GROUP BY group_id
   ) as t1
INNER JOIN 
   sometable ON t1.external_id = sometable.external_id
WHERE ...

也许你可以使用“选择最大值(外部id)作为最大值,*从临时组到临时组的id”来实现这一点。是的,你是对的。改变问题是最好的方法,我应该遵循“如果你有一个你不能解决的问题,把它改成你能解决的”。有了合适的索引,它工作得很好。小问题,但您选择t1.group\U id而不是某些_table.group\U id有什么原因吗?效率更高吗?