2016-03-01 71 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