11

我正在尝试在具有大约 500,000 条记录和大约 50 或 60 列的表中创建查询。我需要的是将这些记录整理成组并选择每个组中的最大记录。

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

+----+-------------+----------+--------+
| id | external_id | group_id | mypath |
+----+-------------+----------+--------+
|  1 |        1003 |        1 | a      | 
|  2 |        1004 |        2 | b      | 
|  3 |        1005 |        2 | c      | 
+----+-------------+----------+--------+

简单的group by如下

select * from temp GROUP BY group_id

返回

+----+-------------+----------+--------+
| id | external_id | group_id | mypath |
+----+-------------+----------+--------+
|  1 |        1003 |        1 | a      | 
|  2 |        1004 |        2 | b      | 
+----+-------------+----------+--------+

不错,但不是我想要的。我想要的是每个组中最大 enternal_id 的整个记录​​。换句话说

+----+-------------+----------+--------+
| id | external_id | group_id | mypath |
+----+-------------+----------+--------+
|  1 |        1003 |        1 | a      | 
|  3 |        1005 |        2 | c      | 
+----+-------------+----------+--------+

不知何故,我希望在这里放置一个 max(external_id) 语句来过滤所需的内容,但到目前为止我的所有调查都失败了。一些指导将不胜感激。重要的是,在返回 max(external_id) 时,选择整个记录作为路径列不同。

4

1 回答 1

19

在http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/有很多信息

这一直是 MySQL 中一个令人讨厌的问题。有一些方法可以解决它,例如将几个字段连接在一起(从 external_id 开始),然后选择其中的 MAX(),然后将其拆分。

我建议你使用派生表。第一个表 (t1) 派生自一个简单查询,您可以在其中识别MAX(external_id),然后从该表中加入以获取其余数据。

这仅在external_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 ...
于 2012-10-02T23:23:02.010 回答