--
-- 表的结构 `test`
--CREATE TABLE IF NOT EXISTS `test` (
`pid` int(11) NOT NULL,
`tid` int(1) DEFAULT NULL,
`dateline` int(11) DEFAULT NULL,
PRIMARY KEY (`pid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;--
-- 转存表中的数据 `test`
--INSERT INTO `test` (`pid`, `tid`, `dateline`) VALUES
(1368605, 111632, 1212230610),
(1368606, 111812, 1212230613),
(1368640, 111812, 1212230927),
(1368649, 111795, 1212231003),
(1368660, 111795, 1212231152),
(1368699, 111795, 1212231549),
(1368701, 111795, 1212231558),
(1368731, 111795, 1212231803),
(1368738, 111812, 1212231858);
/*
问题需求:
按照tid分组,然后每组中取出dateline值最大的记录
将上面得到的记录按照dateline排序后,取出top2对应的pid结果:
pid
1368605
1368738
1368731
*/drop table test
-- 表的结构 `test`
--CREATE TABLE IF NOT EXISTS `test` (
`pid` int(11) NOT NULL,
`tid` int(1) DEFAULT NULL,
`dateline` int(11) DEFAULT NULL,
PRIMARY KEY (`pid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;--
-- 转存表中的数据 `test`
--INSERT INTO `test` (`pid`, `tid`, `dateline`) VALUES
(1368605, 111632, 1212230610),
(1368606, 111812, 1212230613),
(1368640, 111812, 1212230927),
(1368649, 111795, 1212231003),
(1368660, 111795, 1212231152),
(1368699, 111795, 1212231549),
(1368701, 111795, 1212231558),
(1368731, 111795, 1212231803),
(1368738, 111812, 1212231858);
/*
问题需求:
按照tid分组,然后每组中取出dateline值最大的记录
将上面得到的记录按照dateline排序后,取出top2对应的pid结果:
pid
1368605
1368738
1368731
*/drop table test
[征集]分组取最大N条记录方法征集,及散分....
+---------+--------+------------+
| pid | tid | dateline |
+---------+--------+------------+
| 1368605 | 111632 | 1212230610 |
| 1368731 | 111795 | 1212231803 |
| 1368701 | 111795 | 1212231558 |
| 1368699 | 111795 | 1212231549 |
| 1368660 | 111795 | 1212231152 |
| 1368649 | 111795 | 1212231003 |
| 1368738 | 111812 | 1212231858 |
| 1368640 | 111812 | 1212230927 |
| 1368606 | 111812 | 1212230613 |
+---------+--------+------------+
9 rows in set (0.00 sec)mysql> select pid from (select * from test order by tid,dateline desc) t group by tid;
+---------+
| pid |
+---------+
| 1368605 |
| 1368731 |
| 1368738 |
+---------+
3 rows in set (0.00 sec)mysql>
我的理解很肤浅,觉着这条语句分为两步:
第一步:用语句select * from test order by tid,dateline desc形成一个表t
第二部:把表t按照tid分组,然后选出pid(到此为止,无法继续思考下去,因为跟执行结果有差异)
手册中说明了 group by的一种特殊用法。即没有出现在group by 中的字段会选择第一个显示。
非常感谢!~