Mysql:如何找到目前在房间里的用户?

psy*_*sss 2 mysql

我有桌子entrances记录用户进入房间并走出房间的时间.像这样的东西:

user   |   action    |    time
-------------------------------------------
Ivan   |   in        |  2016-08-28 12:00:00 
John   |   in        |  2016-08-28 12:00:01
Ann    |   in        |  2016-08-28 12:00:02
Ivan   |   out       |  2016-08-28 12:00:03
Ivan   |   in        |  2016-08-28 12:00:04
Ann    |   out       |  2016-08-28 12:00:05
Ivan   |   out       |  2016-08-28 12:00:06
Mike   |   in        |  2016-08-28 12:00:07
John   |   out       |  2016-08-28 12:00:08
Ann    |   out       |  2016-08-18 12:00:09
John   |   in        |  2016-08-18 12:00:10
John   |   out       |  2016-08-18 12:00:11
Ann    |   in        |  2016-08-18 12:00:12
Run Code Online (Sandbox Code Playgroud)

用户操作是独立的.唯一已知的是,第一个动作始终是in,用户不能in两次out(和反向).

我的目标是找到目前在房间里的所有用户.

我有两个想法:

  1. 选择out最近没有的用户in
  2. 选择计数in更多的用户out

如何在mysql上实现这个?还是其他任何想法?

用于测试的SQL:

CREATE TABLE `entrances` (
  `id` int(11) NOT NULL,
  `user` varchar(10) COLLATE utf8_bin NOT NULL,
  `action` varchar(3) COLLATE utf8_bin NOT NULL,
  `time` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
INSERT INTO `entrances` (`id`, `user`, `action`, `time`) VALUES
(1, 'Ivan', 'in', '2016-08-28 12:00:00'),
(2, 'John', 'in', '2016-08-28 12:00:01'),
(3, 'Ann', 'in', '2016-08-28 12:00:02'),
(4, 'Ivan', 'out', '2016-08-28 12:00:03'),
(5, 'Ivan', 'in', '2016-08-28 12:00:04'),
(6, 'Ann', 'out', '2016-08-28 12:00:05'),
(7, 'Ivan', 'out', '2016-08-28 12:00:06'),
(8, 'Mike', 'in', '2016-08-28 12:00:07'),
(9, 'John', 'out', '2016-08-28 12:00:08'),
(10, 'Ann', 'out', '2016-08-28 12:00:09'),
(11, 'John', 'in', '2016-08-28 12:00:10'),
(12, 'John', 'out', '2016-08-28 12:00:11'),
(13, 'Ann', 'in', '2016-08-28 12:00:12');
ALTER TABLE `entrances` ADD PRIMARY KEY (`id`);
Run Code Online (Sandbox Code Playgroud)

jue*_*n d 5

  1. 首先timeuser子查询中获取每个操作
  2. 然后加入该子查询,只有每个子查询的最后一条记录 user
  3. 然后只获取那些action = in带有where子句的记录

像这样

select e.*
from entrances e
join
(
   select user, max(time) as mtime
   from entrances
   group by user
) t on t.user = e.user 
   and t.mtime = e.time
where e.action = 'in'
Run Code Online (Sandbox Code Playgroud)