2016-11-27 40 views
1

我有2個表:從一個表中選擇新的日期與集團其他表通過

訂單

  • PURCHASE_DATE(這是輸入 '日期時間')
  • ITEM_PRICE
  • SKU
  • 其他數據

total_sales_by_date

  • 日期
  • TOTAL_SALES

的訂單表得到更新由API每天的基礎上。 total_sales_by_date表僅將每個sku上的所有銷售額相加,並按日期將它們按照該日期的所有skus /銷售額的SUM總計進行分組。我使用這個查詢:

INSERT INTO total_sales_by_date SELECT DATE(purchase_date) AS date, SUM(item_price) AS total_sales FROM orders GROUP BY date 

對於數據庫的效率,我想更新只通過API走進1臺新的銷售數據每天都在2號桌。即 - 我不想重新插入我已經在第二個表中的舊數據。

此外,我想創建一個過程,每天凌晨4點運行(或其他)。

回答

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獲取它們。如果您在orders表上的(purchase_date, item_price)上定義了複合索引,則使用該視圖不應該太過於性能影響。

+0

哇。這很有趣。所以最終的遊戲是在Excel中或在基於Web的平臺中繪製這些東西。考慮到這一點,將使用視圖然後在服務器上創建更多的資源,而不是簡單地下載以前填充的表格? – user800507

+0

我想你的意思是消耗更多的資源。 (我希望查詢可以創建更多的資源。:-) :-)不是很明顯,除非你一小時多次運行這個圖表程序,並且你的'orders'表中至少有100,000行。無論如何,通常的做法是使用簡單的SQL工具(查詢,視圖等)來完成工作。如果你發現你有性能問題,那麼你添加索引。如果這不起作用,你可以使用你在這裏展示的大錘 - 物化視圖。 –

+0

您的策略是利用您的時間(唯一不可替代的資源)來克服您認爲會成爲MySQL服務器的瓶頸。除非你確定瓶頸是真實的,否則沒有任何意義。它可能不是。 –

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;