【问题标题】:MYSQL delete all results having count(*)=1MYSQL 删除所有 count(*)=1 的结果
【发布时间】:2023-03-22 06:36:02
【问题描述】:

我有一个标有两个字段 sesskey (varchar32, index) 和 products (int11) 的表,现在我必须删除所有按 sesskey count(*) = 1 分组的行。 我正在尝试一些方法,但都失败了。

例子:

delete from taged where sesskey in (select sesskey from taged group by sesskey having count(*) = 1)

sesskey 字段不能作为主键,因为它重复了。

【问题讨论】:

    标签: mysql group-by sql-delete


    【解决方案1】:

    子查询应该可以工作

     Delete from taged 
      Where sesskey in 
         (Select sesskey 
          From taged 
          Group by sesskey 
          Having count(*) = 1)
    

    编辑:感谢下面的@Quassnoi 评论...以上将在 MySql 中工作,因为 MySql 限制引用正在更新或删除的表,在子查询我必须使用 Join 做同样的事情......

    【讨论】:

    • #1093 - 您不能在 FROM 子句中指定目标表 'tagged' 进行更新
    • 那个错误令人困惑......这里没有“更新”......它指的是什么?在 Delete 子句中使用表名?或在子查询中使用表名(既不更新也不删除任何东西)
    • MySQL 不支持相关子查询中的目标表(DELETEUPDATE)。是的,这个错误令人困惑。
    • @Quassnoi,Thx,我不知道这个.. 不要使用 MySQL,但我会记住这一点......我打赌(假设)这条规则也适用于在 Where 中有子查询的更新子句 - (我会猛烈抨击并猜测这就是错误消息的实际起草目的......)?
    • @Charles: 当然,这就是它的目的。
    【解决方案2】:
    DELETE  si
    FROM    t_session si
    JOIN    (
            SELECT  sesskey
            FROM    t_session so
            GROUP BY
                    sesskey
            HAVING  COUNT(*) = 1
            ) q
    ON      q.sesskey = si.sesskey
    

    您需要在这里加入。使用相关子查询将不起作用。

    更多详情请参阅我博客中的这篇文章:

    【讨论】:

    • 由于某种原因,这在最近的 mysql 版本中对我不起作用。我不得不使用您博客中的示例(LEFT JOIN,ID IS NULL)。我也设法删除了错误的行:p(我的情况必须使用 IS NOT NULL)
    • 即使t_sessionTEMPORARY,这是否有效?我被告知在查询中包含两次表与 TEMPORARY TABLE 的使用不兼容,因为 13-year-old "Can't reopen table" bug
    • @DamianYerrick:我不知道它是否适用于最近的版本,但它不适用于旧版本。
    【解决方案3】:

    或者,如果您使用的是较旧(4.1 之前)版本的 MySQL,并且无法访问子查询,则需要将数据选择到表中,然后将该表与原始表连接:

    CREATE TABLE delete_me_table (sesskey varchar32, cur_total int);
    
    INSERT INTO delete_me_table SELECT sesskey, count(*) as cur_total FROM orig_table
    WHERE cur_total = 1 GROUP BY sesskey;
    
    DELETE FROM orig_table INNER JOIN delete_me_table USING (sesskey);
    

    现在您有一个名为delete_me_table 的表,其中包含您删除的所有行的历史记录。您可以将其用于存档、趋势、其他有趣和不寻常的事情,让自己惊喜。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-26
      • 2013-01-24
      • 1970-01-01
      • 2010-09-19
      • 1970-01-01
      • 2018-09-11
      • 2015-12-15
      • 1970-01-01
      相关资源
      最近更新 更多