下面是我的表ddl和数据:
CREATE TABLE `Msg` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`session_id` bigint(20) unsigned NOT NULL,
`create_date` datetime NOT NULL,
`content` varchar(32) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1;
/*Data for the table `Msg` */
insert into `Msg`(`id`,`session_id`,`create_date`,`content`) values (1,11,'2016-10-01 20:30:34','hello 1'),(2,11,'2016-10-02 20:30:47','hello 2'),(3,11,'2016-10-11 20:31:07','hello 3'),(4,12,'2016-10-04 20:31:22','world 1'),(5,12,'2016-10-26 20:31:42','world 2'),(6,13,'2016-10-05 20:31:58','good 1'),(7,13,'2016-10-28 20:32:16','good 2'),(8,13,'2016-10-07 20:39:44','good 3');
如何获取Msg记录:
如示例所示,结果应该是id为7和5的两行。
答案 0 :(得分:0)
以下是执行此操作的典型方法:
select m.*
from msg m
where m.id = (select max(m2.id) from msg m2 where m2.session_id = m.session_id);
注意:虽然您要求的是最近的日期,但这会使用id
。它是一个自动递增的id,所以我做出了合理的假设,即更大的ID意味着更大的日期。当然,您可以将id
条件中的where
替换为create_date
。
如果您有一张较大的表,那么您需要msg(session_id, id)
上的索引(如果您使用该字段,则需要msg(session_id, create_date)
)。