Mysql 每小时从一张表中归档5条随机记录,并使重量为1/4
我有两张桌子,一张是发票满的,另一张是测试发票满的 在我的基于php和mysql的web应用程序中,每小时有100条记录被输入InvoiceFull。 我需要在MySQL中创建一个事件,以每小时从InvoiceFull获取5条记录和1/4的权重,并将这些记录插入TestInvoiceFull。TestInvoiceFull是我的归档表 我编写了如下查询,每小时插入1条记录,但每小时需要5条记录Mysql 每小时从一张表中归档5条随机记录,并使重量为1/4,mysql,events,datetime,random,Mysql,Events,Datetime,Random,我有两张桌子,一张是发票满的,另一张是测试发票满的 在我的基于php和mysql的web应用程序中,每小时有100条记录被输入InvoiceFull。 我需要在MySQL中创建一个事件,以每小时从InvoiceFull获取5条记录和1/4的权重,并将这些记录插入TestInvoiceFull。TestInvoiceFull是我的归档表 我编写了如下查询,每小时插入1条记录,但每小时需要5条记录 INSERT INTO TestInvoiceFull (Weight,Status,StatusCh
INSERT INTO TestInvoiceFull (Weight,Status,StatusChangedTime)
SELECT a.Weight/4 AS ApprovedWeight,
a.Status,
a.StatusChangedTime
FROM InvoiceFull a
INNER JOIN
(SELECT DATE(StatusChangedTime) date, HOUR(StatusChangedTime) hour,
MIN(StatusChangedTime) min_date
FROM InvoiceFull
WHERE status='Approved'
GROUP BY DATE(StatusChangedTime),
HOUR(StatusChangedTime)) b ON DATE(a.StatusChangedTime) = b.date
AND HOUR(a.StatusChangedTime) = b.hour
AND a.StatusChangedTime = b.min_date;
我在小时组中选择了最短时间,因此每小时只能获取1行。我怎样才能每小时提取5条或在一般情况下N条记录
INSERT INTO TestInvoiceFull (Weight,Status,StatusChangedTime)
SELECT a.Weight/4 AS ApprovedWeight,
a.Status,
a.StatusChangedTime
FROM InvoiceFull a
INNER JOIN
(SELECT DATE(StatusChangedTime) date, HOUR(StatusChangedTime) hour,
MIN(StatusChangedTime) min_date
FROM InvoiceFull
WHERE status='Approved'
GROUP BY DATE(StatusChangedTime),
HOUR(StatusChangedTime)) b ON DATE(a.StatusChangedTime) = b.date
AND HOUR(a.StatusChangedTime) = b.hour
AND a.StatusChangedTime = b.min_date;
提前感谢。您的要求是:
随机选择的记录。。。
从前一个小时开始。。。
插入修改。。。
按日期时间升序编辑。
让我们一次拿一个。要随机选择五条记录,您需要
SELECT whatever
FROM table
ORDER BY RAND()
LIMIT 5
虽然速度不快,但可以用
第二,您需要选择前一个小时内StatusChangedTime的记录。要做到这一点,你需要一种方法来开始现在的时刻
STR_TO_DATE(NOW(), '%Y-%m-%d %H:00:00')
是这样的。现在需要时间,并将分和秒更改为零。我们可以用同样的想法来开始前一个小时:
STR_TO_DATE(NOW(), '%Y-%m-%d %H:00:00') - INTERVAL 1 HOUR
那么,让我们在WHERE子句中使用这些表达式
SELECT whatever
FROM InvoiceFull a
WHERE a.StatusChangedTime >= STR_TO_DATE(NOW(), '%Y-%m-%d %H:00:00') - INTERVAL 1 HOUR
AND a.StatusChangedTime < STR_TO_DATE(NOW(), '%Y-%m-%d %H:00:00')
最后,您希望随机的五条记录按日期时间戳的顺序排列。因此,将基本的SELECT查询放入子查询中
INSERT INTO TestInvoiceFull
(Weight,Status,StatusChangedTime)
SELECT *
FROM (
SELECT (a.Weight * 0.25) AS ApprovedWeight,
a.Status,
a.StatusChangedTime
FROM InvoiceFull a
WHERE a.StatusChangedTime >= STR_TO_DATE(NOW(), '%Y-%m-%d %H:00:00') - INTERVAL 1 HOUR
AND a.StatusChangedTime < STR_TO_DATE(NOW(), '%Y-%m-%d %H:00:00')
ORDER BY RAND()
LIMIT 5
) b ORDER BY StatusChangedTime
这是你的五条随机记录,按日期顺序排列。在每小时的某个时间运行此命令,您将获得上一小时记录的样本。我一直等到每小时过去五到十分钟才收到最好的效果,以防系统的某些部分落后
请注意,您在问题的查询中误用了GROUP BY。GROUP BY仅在您使用SUM等聚合运算时提供帮助。谢谢您的帮助。我需要更多的帮助。我想获得随机记录,但这些记录应按状态更改时间的顺序排列。比如,如果我有12张记录,时间分别为18:05:00、18:09:00、18:14:00、18:21:00、18:33:00、18:37:00、18:38:00、18:39:00、18:39:08、18:40:05、18:40:08、18:45:00,那么我应该会得到以下五张记录18:05:00、18:14:00、18:37:00、18:38:00、18:40:05。。。。现在我得到的随机记录是18:38:00、18:05:00、18:14:00、18:40:05、18:37:00……在我的例子中,MySQL DATE_FORMAT函数可以很好地工作,而不是STR_TO_DATE。我使用的代码插入到TestInvoiceFull Weight,Status,StatusChangedTime中,选择a.Weight*0.25作为批准的Weight,a.Status,a.StatusChangedTime FROM InvoiceFull a,其中a.StatusChangedTime>=日期\格式'2014-10-10 17:07:32','%Y-%m-%d%H:00:00'-间隔1小时,a.StatusChangedTime<日期\格式'2014-10-10 17:07:32',“%Y-%m-%d%H:00:00”按兰德限值排序5当然,使用DATE\u格式,可以将日期字符串隐式转换为日期时间项,然后将其显式格式转换为字符串,然后隐式转换为日期时间项以用于比较。当然,它是有效的。它也很有效,因为它只发生在查询的开头。