Mysql 每小时从一张表中归档5条随机记录,并使重量为1/4

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

我有两张桌子,一张是发票满的,另一张是测试发票满的

在我的基于php和mysql的web应用程序中,每小时有100条记录被输入InvoiceFull。 我需要在MySQL中创建一个事件,以每小时从InvoiceFull获取5条记录和1/4的权重,并将这些记录插入TestInvoiceFull。TestInvoiceFull是我的归档表

我编写了如下查询,每小时插入1条记录,但每小时需要5条记录

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格式,可以将日期字符串隐式转换为日期时间项,然后将其显式格式转换为字符串,然后隐式转换为日期时间项以用于比较。当然,它是有效的。它也很有效,因为它只发生在查询的开头。