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 评估我们的变量一定的顺序,我们必须将它们包装在一堆条件语句中。这使查询变得丑陋,但它起作用了。
我在 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,但我不知道如何处理日期。
请注意,我认为您的预期结果是错误的(即,显示某些组的错误日期,显示不应分组在一起的分组 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 评估我们的变量一定的顺序,我们必须将它们包装在一堆条件语句中。这使查询变得丑陋,但它起作用了。