2016-03-01 95 views
0

所以我有一些数据是:MySQL的删除插入后选择

'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, 页,排除相关的,空的,不可分析的,不相关,外语, 损坏,复制,emptyparsed,日期)

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

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

比如我有查询:

INSERT INTO crawlstats.feeds_stats

(feed_rowid,feed_scans,feed_changed,feed_unchanged,feed_failures,url_dups, 页,排除相关的,空的,不可分析的,不相关,外语, 损坏,复制,emptyparsed,日期)

(SELECT feed_rowid,总和(feed_scans)作为feed_scans,总和(feed_changed)作为feed_changed, 总和(feed_unchanged)作为feed_unchanged,总和(feed_failures)作为feed_failure s,sum(url_dups)作为url_dups, 作为页面的总和(页面),作为排除的总和(排除),作为相关的总和(相关),作为空的总和(空的), 作为不可解析的总和(不可解析的)作为不相关的,和(外语)作为外语, 为损坏总和(损坏),和(一式两份)为重复,如emptyparsed总和(emptyparsed),日期(“2014年9月1日”)作为日期 FROM crawlstats.feeds_stats其中feed_rowid = 4784和日期>'2014-08-01'和日期<'2014-09-01')

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

回答

0

让你有feed_RowID

X记录你添加一个新的记录中是limts的范围内。 所以,你需要排除具有最高的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是自动编号,因此一个插永远是最大。如果系统中有多个用户同时更新此feed_RowID,则可能会遇到计时问题。问题可能会消失,如果这是包装在一个过程中,并且都包含在一个事务中。

或者,您可以让您的选择返回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(); 
+0

看来RowID <>(Select max(rowID)where feed_RowID = 4784)将导致删除查询不删除任何东西。我试图让删除到选择,它也不会返回任何东西。但是,如果我将它更改为RowID <>(从crawlstats.feeds_stats where feed_RowID = 4784中选择max(rowID)),那么select查询将返回我们想要的内容,但将其更改回删除它将会导致错误:Error Code :1093.您无法在FROM子句中指定目标表'feeds_stats'进行更新。有什么想法吗? – Skyhawk