2009-09-08 56 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