我有两张桌子:
订单
total_sales_by_date
订单表每天都会通过API进行更新。 total_sales_by_date表仅将每个sku中的所有销售额相加,并按日期对它们进行分组,并在该日期对所有skus / sales进行总计。我正在使用此查询:
INSERT INTO total_sales_by_date SELECT DATE(purchase_date) AS date, SUM(item_price) AS total_sales FROM orders GROUP BY date
为了提高数据库效率,我想每天只更新第二个表,只包含API第一个表中的新销售数据。即 - 我不想重新插入我已经在第二个表中的旧数据。
此外,我想创建一个程序,每天早上4点(或其他)运行。
答案 0 :(得分:0)
如果您在每天当地时间午夜后的某个时间运行以下查询,您将获得所需内容。我建议在凌晨3点之后运行它,这样你就不会在夏令时开始或结束的日子里出现异常。
INSERT INTO total_sales_by_date
SELECT DATE(purchase_date) AS date,
SUM(item_price) AS total_sales
FROM orders
WHERE purchase_date >= CURDATE() - INTERVAL 1 DAY
AND purchase_date < CURDATE()
GROUP BY DATE(purchase_date)
选择昨天的销售,汇总它们,并将它们插入到您的total_sales
表中。您可以使用MySQL event
运行它。这是一个explanation of the event scheduler。
但是你可能会采取艰难的方式做事,在那里你可以更容易。您的total_sales
表有时被称为“物化视图”。也就是说,它完全来自其他一些表,并且不包含其他信息。您可以通过将其定义为普通视图来完全取消定期更新它的业务。
CREATE OR REPLACE VIEW total_sales
AS
SELECT DATE(purchase_date) AS date,
SUM(item_price) AS total_sales
FROM orders
GROUP BY DATE(purchase_date)
然后,只要您需要来自total_sales
的行,MySQL就会从orders
获取它们。如果您在(purchase_date, item_price)
表上的orders
上定义复合索引,则使用该视图不应过多地影响性能。
答案 1 :(得分:0)
您可以使用这样的查询。你可以运行你想要的频率。它只向昨天插入订单,并从total_sales_by_date
中检查最大日期INSERT INTO total_sales_by_date (date,total_sales)
SELECT
DATE(purchase_date) AS date,
SUM(item_price) AS total_sales
FROM orders
where (
SELECT IF( max(date) is null,'1900-01-01',max(date) + interval 1 day)
FROM total_sales_by_date
) < purchase_date
AND purchase_date < date(now() - interval 1 day)
GROUP BY date;