MYSQL删除所有具有count(*)= 1的结果

时间:2009-12-14 16:44:05

标签: mysql group-by sql-delete

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

示例:

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

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

3 个答案:

答案 0 :(得分:9)

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

你需要在这里加入。使用相关子查询将无效。

有关详细信息,请参阅我的博客中的这篇文章:

答案 1 :(得分:1)

SubQuery应该可以工作

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

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

做同样的事情

答案 2 :(得分:1)

或者,如果您使用较旧的(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的表格,其中包含您删除的所有行的历史记录。您可以将其用于存档,趋势,其他有趣和不寻常的事情,让您大吃一惊。