2009-09-08 63 views
4

好子查詢的所有結果,所以如果你想一回的故事,看我previous questionMySQL的刪除

搞清楚其中我的記錄是不是重複是很容易的:

SELECT * 
FROM eventlog 
GROUP BY event_date, user 
HAVING COUNT(*) = 1 
ORDER BY event_date, user 

這將返回所有非重複項。所以我想我會將它們移動到另一個名爲「no_duplicates」的表中,然後從原始表中刪除它們。然後,我可以在原始表格中單獨看到重複項,然後修復它們,然後添加no_dupes。不過,雖然:

INSERT INTO no_duplicates 
SELECT * 
FROM eventlog 
GROUP BY event_date, user 
HAVING COUNT(*) = 1 
ORDER BY event_date, user 

工程就像一個魅力,下面拋出一個錯誤:

DELETE 
FROM eventlog 
GROUP BY event_date, user 
HAVING COUNT(*) = 1 
ORDER BY event_date, user 

我的猜測是,雖然該查詢返回唯一的,已經在最表記錄,通過刪除聚合函數不是猶太教。這是可以理解的,除了我不知道我能做些什麼來確保只有我移動的記錄被刪除。我搜索並沒有發現「INSERT殺死原始表中的記錄後」語法,我的猜測是它會失敗,因爲刪除失敗的原因相同。

那麼,有人能幫我找到失蹤的一塊嗎?

回答

6

首先no_dupes,您不需要INSERT和DELETE上的ORDER BY。如果您需要它們進行演示,那麼這些操作就不是這種情況。

如果您EVENTLOG表中有一個主鍵(如ID),你可以形成你的DELETE語句是這樣的:

DELETE 
FROM eventlog 
WHERE id IN (
    SELECT * 
    FROM eventlog 
    GROUP BY event_date, user 
    HAVING COUNT(*) = 1 
) 
-1

您可以嘗試添加一個主鍵自動遞增列,請將您的唯一身份到一個新表,並做了刪除事件日誌。*從事件日誌Ë內部聯接ND上e.id = nd.id

1

你應該看看DELETE syntax,既沒有分組依據,也不HAVINGs ,也沒有訂單。

+0

對不起,我是儘可能有效地抓住一切。我知道ORDERS不是刪除東西的必要條件。我很快就知道GROUP BY和HAVINGs已經不在了,所以這個問題。 – Anthony 2009-09-08 08:10:16

+0

DELETE中的**不允許**(除了毫無意義) – soulmerge 2009-09-08 10:21:53

+0

絕對* ORDER *在MySQL的'DELETE'中允許。 [並且已經很長時間了。](https://dev.mysql.com/doc/refman/4.1/en/delete.html)*「如果DELETE語句包含ORDER BY子句,則行是按照子句中指定的順序刪除,主要用於與LIMIT結合使用...... ORDER BY在某些情況下也可能有用,以避免違反參照完整性的順序刪除行ORDER BY可以與DELETE一起使用從MySQL 4.0.0開始。「* – dkarp 2015-04-23 23:11:48

4

我不會用集合函數刪除。我想你想刪除所有插入的數據?

爲什麼不嘗試這樣的事:

DELETE 
FROM eventlog 
WHERE (user, event_date) IN (SELECT user, event_data FROM no_duplicates) 
+0

所以,要清楚。將WHERE子句放在括號中意味着用戶和事件日期都需要在no_duplicates表的特定行中?因爲顯然用戶和event_dates在兩個地方都是獨立重複的。 好吧,我討厭聽起來衝或無能,所以請原諒我。我非常擔心,因爲重建這件事需要更多的時間,讓人們更加惱火。我討厭最後期限。 – Anthony 2009-09-08 08:08:18

+0

是的 - 但要100%肯定 - 在嘗試語句前始終備份 – bernhardrusch 2009-09-08 08:39:24

+0

因此,這意味着該語句將刪除用戶AND event_date與來自no_duplicates的行中相同的所有行。 我認爲這是你想要的? 否則,您將不得不指定一個更好的密鑰(id?) – bernhardrusch 2009-09-08 08:40:50