0

我正在尝试解决一个需要像这样的表格的问题:

--- LOG ---
user  time  status
0     001   ARRIVED
0     003   LEFT
0     009   ARRIVED
1     004   ARRIVED
0     012   LEFT
1     008   LEFT

并执行以下任务:对于每个 ARRIVAL 时间,为每个用户找到最近的 LEFT 时间。

user  ARRIVED   LEFT
0     001       003
0     009       012
1     004       008

但是我发现很难实现。

我正在尝试以某种方式将这两个查询结合在一起

SELECT * 
FROM (
    SELECT `user`, `time`  FROM LOG
    WHERE `status` = 'ARRIVED'
);

SELECT * 
FROM (
    SELECT `user`, `time`  FROM LOG
    WHERE `status` = 'LEFT' AND `user` = [USER FROM PREVIOUS TABLE] AND `time` >= [TIME FROM PREVIOUS TABLE]
    ORDER BY `time` ASC
    LIMIT 1
);

4

3 回答 3

0

你可以尝试这样的事情:

SELECT
      a.`user`
    , a.`time` AS `ARRIVED`
    , l.`time` AS `LEFT`
FROM 
    `LOG` AS a
    INNER JOIN `LOG` AS l ON (
            l.`status` = 'LEFT'
        AND l.`user` = a.`user`
        AND l.`time` > a.`time`
    )
    LEFT JOIN `LOG` AS l_prev ON (
            l_prev.`status` = 'LEFT'
        AND l_prev.`user` = l.`user`
        AND l_prev.`time` < l.`time`
        AND l_prev.`time` > a.`time`
    )
WHERE
        a.`status` = 'ARRIVED'
    AND l_prev.`time` IS NULL
;

=>

user    ARRIVED LEFT
0   1   3
0   9   12
1   4   8

在我的例子中时间是 INT

于 2019-07-05T02:39:21.847 回答
0

请尝试以下查询。

select a.user,a.time as 'ARRIVED',min(b.time) as 'LEFT'
from log a,log b
where a.user=b.user
and a.status='ARRIVED'
and b.status='LEFT'
and a.time<=b.time
group by a.user,a.time

该表有 6 条记录,对表进行自连接将给出 36 条记录,我们可以从中过滤出我们需要的所有组合。以下是过滤器 1) 基于用户的过滤器,因为我们只寻找特定的用户操作 2) 需要比较的过滤器,到达与 LEFT 3) 对于任何 LEFT 时间,我们只需要查找 LEFT 时间之前的到达时间它也可以相同。(a.time<=b.time)
4) 基于用户和到达时间的分组将为您提供大于或等于任何用户到达时间的所有 LEFT 时间的列表。5) 使用聚合器 MIN,因为我们只寻找给定用户到达时间的最早 LEFT 时间。

于 2019-07-05T07:23:49.057 回答
0

您可以使用您的查询而不使用这样的连接:

select 
  t.user, 
  t.time ARRIVED,
  (select time from log where user = t.user and status = 'LEFT' and time > t.time 
   order by time asc limit 1) `LEFT`    
from log t
where t.status = 'ARRIVED'

请参阅演示
结果:

| user | ARRIVED | LEFT |
| ---- | ------- | ---- |
| 0    | 001     | 003  |
| 0    | 009     | 012  |
| 1    | 004     | 008  |
于 2019-07-05T07:39:11.503 回答