2017-09-05 52 views
0

閱讀此線程後:MySQL - Subtracting value from previous row, group byMySQL錯誤1064使用SQLVars

我用過的最upvoted答案中描述的方法,並寫了下面的代碼:

SELECT 
     T.id_str, 
     T.created_at, 
     T.retweet_count, 
     T.tweeted_at, 
     if (@lastid_str = T.id_str, T.retweet_count - @lastretweet_count, 0000.00) as RetweetChange, 
     @lastid_str := T.id_str, 
     @lastretweet_count := T.retweet_count 
    FROM 
     Tweets T, 
     (SELECT @lastid_str := 0, 
       @lastretweet_count :=0) SQLVars 
    ORDER BY 
     T.tweeted_at DESC, 
     T.id_str; 

老問題解決了,新的問題:如何寫一個觸發器。

enter image description here

我的表看起來像這樣。其中,id_str是特定推文的唯一標識符。由於我每分鐘從單個用戶插入50條推文,因此會有許多相同的id_str。我想看看的是每分鐘改變retweet_count。 tweeted_at是當用戶推特時,created_at是當這個數據被插入到我的數據庫中。我想爲插入到數據庫的每個新數據生成retweet_change(與retweet_change列相比)。我應該如何編寫觸發器?

+0

您在「T.tweeted_at」列後缺少逗號。現在看看它是否有效,正如你預期的那樣。有一個乾淨的格式化可讀查詢有助於錯過這樣簡單的事情:)但它只是習慣於格式化的習慣,因爲你學習。另外,我認爲您需要首先更改ID_Str的順序,因爲它似乎是您的IF()比較工作的分組基礎 – DRapp

+0

!謝謝。我無法想象這是一個如此愚蠢的錯誤。 – Dylan

+0

而不是做這個任務的查詢,有沒有辦法創建一個生成的列,以便我可以在MySQL中插入數據時自動計算數據?我的數據庫設計如下:每分鐘插入50個新行,我有一個自動遞增的主鍵。所以我想我可以這樣做:選擇最新插入的50行(Max(id)to Maxid - 50)將它們與之前插入的50行(Max(id)-50,Max(id)-100)進行比較if id_str是相同的計算轉推差異? – Dylan

回答

0

特別是在基於Web的解決方案中,計數器和聚合是常見的,而且數據有點靜態(即:舊數據不會更改,被刪除等)並且可以添加新數據,因此觸發器可以提供幫助。

您可以在適當的位置添加幾列以獲得這些聚合。然後,當新記錄被添加到一個表格中時,彙總表格(或者諸如轉推的父母標識符)可以更新1個,或者如果其他的如財務,訂單數量等,則可以更新。這將簡化您的計數因爲總數總是在添加條目時運行。

您只需通過預先彙總和更新相關記錄來準備觸發器即可準備計數,然後剩下的就會繼續保持同步。

+0

對不起,我對此很陌生。你能給我一些示例代碼,我應該如何寫這個觸發器?我已更新了我的表格中的信息。非常感謝! – Dylan