遍历SQL表,对符合条件的每一行执行查询

时间:2019-07-05 01:57:09

标签: mysql sql database

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

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

3 个答案:

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