我正在尝试解决一个将像这样的表格的问题:
NinjectWebCommon
并执行以下任务:对于每个到达时间,为每个用户找到最接近的LEFT时间。
/// <summary>
/// Load your modules or register your services here!
/// </summary>
/// <param name="kernel">The kernel.</param>
private static void RegisterServices(IKernel kernel)
{
kernel.Bind(typeof(ISecurityRepository)).To(typeof(Data.SecurityRepository));
}
但是我发现很难实现。
我正在尝试以某种方式将这两个查询结合在一起
--- LOG ---
user time status
0 001 ARRIVED
0 003 LEFT
0 009 ARRIVED
1 004 ARRIVED
0 012 LEFT
1 008 LEFT
答案 0 :(得分: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
在我的示例中,时间是整数
答案 1 :(得分: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)需要比较的过滤器,到达的与左边的
3)对于任何LEFT时间,我们只需要查找LEFT时间之前的到达时间,它也可以相同。 (a.time <= b.time)
4)根据用户和到达时间分组,将为您列出所有LEFT时间的列表,这些时间大于或等于任何用户的到达时间。
5)使用聚集器MIN是因为我们只寻找给定用户的到达时间的最早的LEFT时间。
答案 2 :(得分: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'
请参见demo。
结果:
| user | ARRIVED | LEFT |
| ---- | ------- | ---- |
| 0 | 001 | 003 |
| 0 | 009 | 012 |
| 1 | 004 | 008 |