如何在SQL中删除除一行之外的所有行

时间:2011-09-10 12:54:59

标签: database duplicates

我想删除除一行之外的所有内容,但与PHP结合使用。

我认为这对我的问题来说是一个更简单的解决方案,即删除重复的信息。

好的......我刚刚意识到我已经做过的事就是垃圾。

基本上我有一个表(dev_discs),我想在'discReference'列中搜索重复项,然后删除除一个之外的所有重复项,从而留下剩下的一行。

有一个简单的查询来做到这一点?我在网上遇到过类似的情况而且它们都很复杂......我认为这不是一个非常复杂的场景。

2 个答案:

答案 0 :(得分:0)

没有简单的方法,AFAIK。使用PHP它应该不会太难(我可以想到你不能只使用SQL轻松地做到这一点)。

  1. 创建一个与原始表格结构相同的新表格:

    CREATE TABLE dev_discs_noduplicates(     ... );

  2. 使用GROUP子句从原始表中获取所有非重复数据,以消除重复:

    SELECT * FROM dev_discs WHERE 1 GROUP BY dupe_col1,dupe_col2;

  3. 迭代结果并将它们插入新表:

    INSERT INTO dev_discs_noduplicates ...;

  4. 删除旧表

    DROP TABLE dev_discs;

  5. 重命名新表:

    RENAME TABLE dev_discs_nodulicates TO dev_discs;

  6. [编辑]

    由于@xanatos正确地评论了数据库中可能的关系丢失,这里是一个涉及SQL和PHP的替代解决方案。

    首先,获取唯一的行:

    SELECT id FROM dev_discs GROUP BY col1, col2;
    

    将这些内容放入PHP数组中,将其内化并在删除查询中使用:

    DELETE FROM dev_discs WHERE (id) NOT IN ( @arr );
    

    这应该解决所有可能的问题。

答案 1 :(得分:0)

DELETE FROM discs dd WHERE EXISTS
    ( SELECT * FROM discs d2
     WHERE d2.discReference = dd.discReference
     AND d2.rownumber < dd.rownumber
    );

“rownumber”是一个内部ID,由您的DBMS提供。可以称为tid,oid。