按顺序/范围概念分组

  • 本文关键字:范围 顺序 mysql sql
  • 更新时间 :
  • 英文 :


我使用mySql时遇到了一个问题。我的表中有以下记录任务

idTask | User | Task  | Step
-----------------------------
1      |   1  | Task1 |  1
2      |   1  | Task2 |  2
3      |   2  | Task3 |  3
4      |   1  | Task4 |  4
5      |   1  | Task5 |  5

我想检索该记录集中的数据:

 User 
--------
   1  
   2  
   1  

用户上的一个分组不尊重顺序,并给我以下结果。

 User 
--------
   1  
   2  

通过一个简单的查询,这可能吗?

这是一个标准的"序列开始和结束"模式:

SELECT a.step start
     , MIN(c.step) end 
     , a.user
  FROM my_table a
  LEFT 
  JOIN my_table b 
    ON b.user = a.user 
   AND b.step= a.step - 1
  LEFT 
  JOIN my_table c 
    ON c.user = a.user 
   AND c.step >= a.step
  LEFT 
  JOIN my_table d 
    ON d.user = c.user
   AND d.step = c.step + 1
 WHERE b.user IS NULL 
   AND c.user IS NOT NULL
   AND d.user IS NULL
 GROUP 
    BY a.step, a.user;

这很棘手。不知何故,您需要确定用户何时与以前的用户不同。

这里有一种方法。它使用相关的子查询来识别给定用户之前不同的用户数量。这为用户分配了一个分组,可用于group by:

select user
from (select t.*,
             (select count(*)
              from task t2
              where t2.idtask <= t.idtask and t2.user <> t.user
             ) as grp
      from task t
     ) t
group by grp, user
order by min(id);

最新更新