如何编写一个可以得到低于结果的SQL查询?

时间:2016-10-22 13:16:19

标签: mysql sql

下面是我的表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记录:

  1. session_id位于(12,13,14)和
  2. 对于每个会话,只选择一个具有max create_date
  3. 的msg记录

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

1 个答案:

答案 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))。