Mysql订单记录由类似的时间和相同的用户

时间:2015-05-07 05:58:02

标签: mysql date time

我在MySql表中有这些记录

   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分钟的时间窗口订购这些记录。例如:Kyle在5:08和5:09之间有两条记录,必须粘在一起。

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

在其他情况下,Stan有2条记录但是在不同的时间窗口

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

对于此示例中的所有表,结果必须为

 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,但我不知道日期是怎么回事。 In this question @pala_(谢谢你,你摇滚)。他解释了如何很好地处理mysql中的时间并帮助我理解时间窗口的麻烦但是mysql现在让我很头疼。

1 个答案:

答案 0 :(得分:0)

警告我认为您的预期结果是错误的(即,显示某些组的错误日期,显示不应组合在一起的分组ID,例如显示两个值为timmy,其中只有两个落在两分钟窗口内),以及你想要第一次从组而不是最后一次显示的警告,以下查询将执行此操作:

  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没有任何窗口功能,因此有必要使用变量创建每组排名,并且为了强制mysql以特定顺序评估我们的变量,我们必须将它们包装在一堆条件语句中。这使查询变得丑陋,但它起作用。

results here