【问题标题】:MySQL delete all results of sub-queryMySQL删除子查询的所有结果
【发布时间】:2010-11-26 10:13:53
【问题描述】:

好的,如果您想了解背景故事,请查看我的previous question

找出我的哪些记录不是重复的很容易:

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

我的猜测是,虽然查询返回唯一的、已在表中的记录,但通过聚合函数删除是不合理的。这是可以理解的,除了我不知道我还能做些什么来确保只删除我移动的记录。我搜索并没有发现“在插入原始表中的记录后”语法,我的猜测是它无论如何都会失败,原因与删除失败的原因相同。

那么,有人可以帮我找到丢失的部分吗?

【问题讨论】:

    标签: mysql insert duplicates sql-delete


    【解决方案1】:

    什么是数据库?如果是 MySQL 则

    目前,您不能在子查询中从表中删除并从同一个表中进行选择。

    至少对于 5.0 版本。 (http://dev.mysql.com/doc/refman/5.0/en/delete.html)

    【讨论】:

      【解决方案2】:

      我不会使用聚合函数删除。我想你想删除所有插入的数据?

      为什么不试试这样的:

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

      【讨论】:

      • 所以,要清楚。将WHERE 子句放在括号中意味着用户和事件日期都需要在 no_duplicates 表的特定行中?因为显然 users 和 event_dates 在两者中都是独立重复的。好的,我讨厌听起来仓促或无能,所以请原谅我。我真的很焦虑,因为重建它需要更多的时间,而且会让人们对我更加恼火。我讨厌最后期限。
      • 是的 - 但要 100% 确定 - 在尝试语句之前总是备份
      • 所以这意味着该语句删除了用户 AND event_date 与 no_duplicates 中的行相同的所有行。我想这就是你想要的?否则你将不得不指定一个更好的密钥(id ?)
      • 另一个提示 - 如果您想测试删除语句是否有效 - 使用带有“select *”的 where 子句。然后你会看到所有将被删除的行。 [也许在某些极端情况下该语句不起作用-但我想不出任何情况)
      • 多字段语法对我来说是真正的救星。谢谢。
      【解决方案3】:

      你应该看看DELETE syntax,既没有 GROUP BY,也没有 HAVING,也没有 ORDER。

      【讨论】:

      • 抱歉,我正在尽可能高效地抓取所有内容。我知道删除东西不需要 ORDERS。我很快就知道 GROUP BY 和 HAVING 已经不存在了,因此提出了这个问题。
      • 订单在 DELETE 中是不允许的(除了毫无意义)
      • ORDER 在 MySQL 中的 DELETE 中绝对允许的。 And has been for a very, very long time. "如果 DELETE 语句包含 ORDER BY 子句,则按该子句指定的顺序删除行。这主要与 LIMIT 结合使用。... ORDER BY 在某些情况下也可能有用按所需的顺序删除行以避免违反参照完整性。ORDER BY 可以与从 MySQL 4.0.0 开始的 DELETE 一起使用。"
      【解决方案4】:

      首先,您不需要在 INSERT 和 DELETE 上使用 ORDER BY。如果您需要它们进行演示,这很有用,而这些操作并非如此。

      如果您的 EVENTLOG 表有一个主键(如 ID),您可以像这样构成您的 DELETE 语句:

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

      【讨论】:

        【解决方案5】:

        您可以尝试添加主键自动递增列,将您的唯一性移动到新表中并删除事件日志。* from eventlog e inner join no_dupes nd on e.id=nd.id

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-06-21
          • 1970-01-01
          • 2023-03-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-09
          • 2012-01-31
          相关资源
          最近更新 更多