Mysql 相同时间相同用户的订单记录

Mysql order records by similar time and same user

我在 MySql table

中有这些记录
   id  |  record_date            |   record_user
   1   |  4/20/2015 5:00:00 PM   |   Kenny
   2   |  4/20/2015 5:08:00 PM   |   Kyle
   3   |  4/20/2015 5:08:20 PM   |   Stan
   4   |  4/20/2015 5:09:00 PM   |   Kyle
   5   |  4/20/2015 6:40:00 PM   |   Cartman
   6   |  4/20/2015 6:41:00 PM   |   Timmy
   7   |  4/20/2015 6:45:00 PM   |   Timmy
   8   |  4/20/2015 6:45:20 PM   |   Timmy
   9   |  4/20/2015 6:45:30 PM   |   Stan

我想按 record_user 和 2 分钟时间 window 订购这些记录。例如:Kyle 在 5:08 和 5:09 之间有两条记录,必须粘在一起。

 record_date           |  ids |  record_user
4/20/2015 5:08:00 PM   |  2,4 | kyle

在其他情况下,Stan 有 2 条记录,但时间不同 window

 record_date           |  ids |  record_user
4/20/2015 5:08:20 PM   |    3 | stan
4/20/2015 6:40:00 PM   |    9 | stan

对于本例中的所有table,结果必须是

 record_date           |  ids |  record_user
4/20/2015 5:00:00 PM   |    1 | kenny
4/20/2015 5:08:00 PM   |  2,4 | kyle
4/20/2015 5:08:20 PM   |    3 | stan
4/20/2015 6:40:00 PM   |    5 | cartman
4/20/2015 6:40:00 PM   |6,7,8 | timmy
4/20/2015 6:40:00 PM   |    9 | stan

我可以连接 id 中的 id 并获得 record_user 和 record_date,但我不知道如何处理日期。 @pala_(谢谢伙计,你太棒了)。他很好地解释了如何处理 mysql 的时间,并帮助我理解了时间 window 的麻烦,但 mysql 现在让我很头疼。

请注意,我认为您的预期结果是错误的(即,显示某些组的错误日期,显示不应分组在一起的分组 ID,例如显示 timmy 的三个值,其中只有两个值属于两个分钟 window),并且需要注意的是您希望从组中第一次而不是最后一次显示,以下查询将执行此操作:

  select min(record_date) record_date, group_concat(id order by id asc) ids, record_user
    from (
      select if(((record_date < @last_record + interval 2 minute) and (@last_user = record_user)) or @last_record = '0000-00-00 00:00:00', 
               if((@last_record := record_date) and (@last_user := record_user), @group, @group),
               if((@last_record := record_date) and (@last_user := record_user), @group := @group + 1, @group := @group + 1)) subgroup, records.* 
        from records, (select @last_record := '0000-00-00 00:00:00', @last_user := '', @group := 1) q
        order by record_user, record_date asc
  ) q 
  group by subgroup
  order by min(record_date) asc;

由于 mysql 没有任何 windowing 功能,因此有必要使用变量创建每组排名,并且为了强制 mysql 评估我们的变量一定的顺序,我们必须将它们包装在一堆条件语句中。这使查询变得丑陋,但它起作用了。

results here