【问题标题】:Database deleting rows with same value数据库删除具有相同值的行
【发布时间】:2011-12-03 11:09:25
【问题描述】:

How to delete duplicate records in mysql database? 的副本

   id  |  name   |      link
    1     bla     www.google.com
    2     lal     www.stackoverflow.com
    3     afs     www.google.com
    4     sds     www.microsoft.com

在我的数据库中,有些行具有相同的链接。我想删除具有相同链接的行之一。

例如,在我的示例中,我想删除 id = 3 但我想保留 id = 1 的行。

我该怎么做?

顺便说一下,有 5840 行。我不知道哪些是相同的。我需要一个代码来比较它们

【问题讨论】:

标签: php mysql sql database


【解决方案1】:

诀窍是通过比较 id 来保持最新值

DELETE FROM table_name t1, table_name t2 WHERE t1.name = t2.name and t1.link = t2.link and t1.id < t2.id

这只是想法,这是我的 oracle 环境中的一个功能齐全的示例(我几周没有使用 db,所以我现在正在尝试最小化查询,抱歉)

SQL> select * from dup;

    ID    STH       STH2
---------- ---------- ----------
     1     45         45
     2     45         56
     3     45         45
     4     14         56
     5     14         56


DELETE FROM dup where id in (SELECT DISTINCT t1.id FROM dup t1, dup t2 WHERE t1.sth = t2.sth and t1.sth2 = t2.sth2 and t1.id < t2.id);

SQL> select * from dup;

    ID    STH       STH2
---------- ---------- ----------
     2     45         56
     3     45         45
     5     14         56

【讨论】:

    【解决方案2】:

    好吧,对于 SQL,您通常必须指定要保留哪一个。以第一个id 为例。然后你可以做一个

    select min(id), link from TABLE group by link
    

    然后删除所有link 与最小ID 不匹配的那些。应该是单个(尽管是嵌套的)SQL 语句。

    【讨论】:

      【解决方案3】:

      如果您知道 URL,但不知道 ID,但知道您只想删除一个,则可以使用限制。

      DELETE FROM `table` WHERE `link` = 'www.google.com' LIMIT 1
      

      或者,如果您知道名称和链接,则将它们一起使用。

      DELETE FROM `table` WHERE `name` = 'afs' AND `link` = 'www.google.com'
      

      【讨论】:

        【解决方案4】:

        您可以选择第一次出现的例如google.com,然后获取第一个 google.com 条目的 ID(例如 first_ID)并删除此 ID 之后的所有内容

        DELETE FROM table where id > first_ID AND link like 'www.google.com'

        【讨论】:

          【解决方案5】:

          未经测试,但我认为这会奏效

          
          $query="SELECT * FROM tablename"; 
          $result=mysql_query($query);
          
          

          while($row = mysql_fetch_array($result) { $query1="SELECT * FROM tablename WHERE link = '".$row[2]."'"; $result1=mysql_query($query1); $count = mysql_num_rows($result1); mysql_query("DELETE FROM tablename WHERE link='".$row[2]."' LIMIT 1,$count"); echo "deleted $row[1]
          "; }

          【讨论】:

            【解决方案6】:

            好的,我已将此设置为单独的答案并删除了我的另一个

            首先,选择表中的所有 Distinct 链接

            SELECT DISTINCT( link ) FROM table
            

            然后,使用 PHP 循环遍历返回的每一行,并将下面的 SQL 应用到被检索的链接。

            DELETE FROM table
            WHERE id IN (
               //Selects Ids whose value is more than the 1st occurence
               SELECT id 
               FROM table 
               WHERE 
                         link = 'CURRENT_LINK' 
                     AND id > ( // Check this isn't the first occurence
                                  SELECT MIN( id ) 
                                  FROM table
                                  WHERE link = 'CURRENT_LINK'
                              )
            )
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2014-12-15
              • 2021-09-12
              • 2017-03-02
              • 2012-01-13
              • 1970-01-01
              • 1970-01-01
              • 2022-12-17
              相关资源
              最近更新 更多