插入select后删除mysql

时间:2016-03-01 20:22:24

标签: mysql select insert

所以我有一些数据:

'38078','4064','48','0','48','0','0','0','0','0','0','0' ,'0','0','0','0','0','2014-09-01 00:00:52'

对应于列:

(rowid,feed_rowid,feed_scans,feed_changed,feed_unchanged,feed_failures,url_dups, 页面,排除,相关,空,不可解决,无关,外语, 损坏,重复,空旷,日期)

其中第二列是id,对于此id,将有来自多个日期的数据,其中date是最后一列。

我想要做的是在一个日期范围内汇总id的所有数据,然后将汇总的数据作为一行添加到数据库中。同时我需要删除我刚刚选择用于求和的所有旧数据,但我不知道如何。

例如我有查询:

INSERT INTO crawlstats.feeds_stats

(feed_rowid,feed_scans,feed_changed,feed_unchanged,feed_failures,url_dups, 页面,排除,相关,空,不可解决,无关,外语, 损坏,重复,空旷,日期)

(选择feed_rowid,sum(feed_scans)作为feed_scans,sum(feed_changed)作为feed_changed, sum(feed_unchanged)为feed_unchanged,sum(feed_failures)为feed_failures,sum(url_dups)为url_dups, sum(pages)as pages,sum(excluded)as excluded,sum(related)as relevant,sum(empty)as empty, sum(unparsable)as notarsable,sum(不相关)as irrelevant,sum(foreignlanguage)as foreignlanguage, sum(损坏)为已损坏,sum(重复)为副本,sum(emptyparsed)为emptyparsed,date('2014-09-01')为date  FROM crawlstats.feeds_stats,其中feed_rowid = 4784,日期>'2014-08-01'和日期< '2014年9月1日')

所以我想删除我在这一个查询的最后一部分中刚刚选择的所有内容。我怎么能这样做?

1 个答案:

答案 0 :(得分:0)

所以你有feed_RowID的X记录

添加一个在限制范围内的新记录。 因此,您需要排除具有最高RowID的行并删除所有其他行...

Delete from feed_Stats 
where feed_rowid=4784 
  and date>'2014-08-01' 
  and date < '2014-09-01' 
  and RowID <> (Select max(rowID) where feed_RowID = 4784)

假设插入的ROWID是自动编号,因此插入的ROWID将始终为最大值。如果系统中有多个用户同时更新此feed_RowID,则可能会出现计时问题。如果这个问题包含在一个程序中并且全部包含在一个事务中,问题可能就会消失。

或者你可以让你的select返回rowID Last_insert_ID()并使用它来排除。对于example

DECLARE LID int;    
SET LID = LAST_INSERT_ID();

所以你可以......

   Delete from feed_Stats 
    where feed_rowid=4784 
      and date>'2014-08-01' 
      and date < '2014-09-01' 
      and RowID <> last_Insert_ID();