--
-- 表的结构 `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

解决方案 »

  1.   

    参考下贴中的多种方法,(N=1)http://topic.csdn.net/u/20091231/16/2f268740-391e-40f2-a15e-f243b2c925ab.html
    [征集]分组取最大N条记录方法征集,及散分....
      

  2.   

    其中一种方法如下。mysql> select * from test order by tid,dateline desc;
    +---------+--------+------------+
    | 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>
      

  3.   

    我始终没有搞明白,这条语句是如何实现选出每组中dateline值最大的一条记录?你能解释一下吗?
      

  4.   

    建议你先自己试着解释一下这个SQL语句,否则别人也根本不知道你目前已经懂了什么,到什么层次,到底是哪儿不懂。写出你自己的理解,然后让别人来看你的理解是否正确。 否则别人解释过简单你还是理解不了,解释得过细,可能又是根本不必要。
      

  5.   

    可以参考一下手册。MySQL官方文档 http://dev.mysql.com/doc/refman/5.1/zh/index.html
      

  6.   

    select pid from (select * from test order by tid,dateline desc) t group by tid;
    我的理解很肤浅,觉着这条语句分为两步:
    第一步:用语句select * from test order by tid,dateline desc形成一个表t
    第二部:把表t按照tid分组,然后选出pid(到此为止,无法继续思考下去,因为跟执行结果有差异)
      

  7.   

    你可以先执行一下 select * from test order by tid,dateline desc 观察一下它的结果。然后
    手册中说明了 group by的一种特殊用法。即没有出现在group by 中的字段会选择第一个显示。
      

  8.   

    彻底明白了,看来真该抽时间好好学习mysql手册。
    非常感谢!~