先看以下的示例数据库表 T:
| id | v | c |
| 1 | 2 | 3 |
| 2 | 3 | 3 |
| 3 | 4 | 5 |
其中id是主键。要求做如下操作:选取具有相同C的数据组中id最大的那一行的v值。经过思考,我得到如下查询语句:
select id, v, c from T where id in ( select max(id) from T group by c);
应查出结果:
| id | v | c |
| 2 | 3 | 3 |
| 3 | 4 | 5 |
可惜现在使用的数据库是老旧的mysql 4.0,不支持子查询,不用子查询能实现这样的功能吗?我试了好多次都不能成功,比如:
select max(id), id, v, c from T group by c;
选出的结果为
| max(id) | id | v | c |
| 2 | 1 | 2 | 3 |
| 3 | 3 | 4 | 5 |
v并非是max(id)对应的值.
如果加上having,如select max(id), v from T group by c having id = max(id); 则出现以下结果:
| max(id) | id | v | c |
| 3 | 3 | 4 | 5 |
看样子having是对group by以后的数据起的效果。细想一下,又找到大学时的课本翻一下,仔细推敲觉得select是按这样的顺序进行的: 原表->where->结果集->group by->分组后的结果集->聚合函数->带聚合结果的结果集(每个分组只取第一条)->having子句过滤->最终结果集。如果这结论是正确的话,那么只有在where时把不需要的去掉,或者在分组后能从分组里取id和max(id)一样的那条。如果用前者,我只能想到用子查询,如果用后者,好像走不通,没有办法控制分组内哪一条被选出。有没有更好的办法呀?