2017-09-05 124 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