2016-10-22 46 views
0

下面是我的表的DDL和数据:如何编写一个可以得到下面结果的SQL查询?

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'); 

如何获得消息的记录是:

  1. SESSION_ID为(12,13,14),和
  2. 每个会话,请选择只有一个msg记录具有最大值create_date

如示例中所示,结果应该是id为7和5的两行。

回答

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意味着更大的日期。当然,您可以用create_date代替where条件中的id

如果您有一个大表,您需要在msg(session_id, id)(或msg(session_id, create_date),如果您使用该字段)的索引。

相关问题