如何从MySQL表中删除重复项?

3

可能是重复的:
仅使用MySQL查询删除重复项?

我有一个包含不同页面的表,但其中一些是重复的。唯一确定重复项的方法是通过标题。我运行下面的代码,它完美地工作:

<?php

mysql_connect("localhost", "root", "root") or die(mysql_error());
mysql_select_db("old") or die(mysql_error());
$result = mysql_query("SELECT pagetitle, COUNT( * ) c
FROM cms_site_content
GROUP BY pagetitle
HAVING c >1") or die(mysql_error());  
while($row = mysql_fetch_array($result)){
    echo $row['id'].'-'.$row['pagetitle'].'<br />';
}

?>

我的问题是:如何删除重复项并仅保留一个条目。例如,如果我有一篇名为“重复文章”的文章,并且结果为

重复文章:3

我只想保留一个。


嗨,安德烈,你能发布一下你的表结构和样本记录吗?谢谢。在提问时这会非常有帮助 :) - John Woo
8
请勿在新代码中使用mysql_*函数。它们已不再得到支持,社区已开始停用过程。看到红框了吗?相反,您应该学习使用预处理语句,并使用PDOMySQLi之一。如果您无法决定,请参阅此文章以作为选择的帮助。如果您有兴趣学习,这里有一个很好的PDO教程 - PeeHaa
这不是你可以在数据库表上手动完成的吗?如果不能,那么删除重复页面的标准是什么? - j08691
5个回答

8
您需要在表格本身上进行 INNER JOIN 并删除其中 pagetitle 值相同但是主键(此处使用 ID 作为标识符)不同的记录。
请尝试如下操作:
DELETE c2 FROM `cms_site_content` c1 INNER JOIN
               `cms_site_content` c2
          ON c1.pagetitle = c2.pagetitle AND c1.ID <> c2.ID

参考文献: http://dev.mysql.com/doc/refman/5.0/en/join.html

这个参考文献是关于MySQL的JOIN操作的,JOIN操作用于从多个表中检索数据并将其组合成一个结果集。通过使用JOIN,可以根据两个或多个表之间的关系联接行。此外,JOIN还可以根据查询的需要包含了相应表中的所有记录或仅包含符合指定条件的行。

也参考:https://dev59.com/OXA75IYBdhLWcg3wRW2c#3383920 - Matt Razza
我使用了这段代码: <?phpmysql_connect("localhost", "root", "root") or die(mysql_error()); mysql_select_db("old") or die(mysql_error()); $result = mysql_query("DELETE FROM 'cms_site_content' AS c1 INNER JOIN 'cms_site_content' AS c2 ON m1.pagetitle = m2.pagetitle AND c1.id <> c2.id") or die(mysql_error()); ?> 它给我的反馈是:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '* FROM 'cms_site_content' AS c1 INNER JOIN 'cms_site_content' AS c2 ON m1.pageti' at line 1。 - Andrei RRR
我使用了这个:DELETE FROM 'cms_site_content' AS c1 INNER JOIN 'cms_site_content' AS c2 ON m1.pagetitle = m2.pagetitle AND c1.id <> c2.id(没有星号)。得到了这个:您的SQL语法有误,请检查与您的MySQL服务器版本相对应的手册,以获取正确的语法使用方法,位于第1行。 - Andrei RRR
#1064 - 您的SQL语法有误;请检查与您的MySQL服务器版本相对应的手册,以获取正确的语法提示。位于第1行 'c1 INNER JOIN cms_site_content c2 ON c1.pagetitle = c2.pagetitle AND c1.ID <> c2'。- 这是直接在phpMyAdmin中创建的。 - Andrei RRR
1
DELETE c2 FROM... 是正确的代码 :) - Andrei RRR

0

这一行代码起作用了:

DELETE t2
FROM cms_site_content t1
JOIN cms_site_content t2 ON (t2.pagetitle = t1.pagetitle AND t2.id > t1.id);

0

选择所有单行,将它们插入到临时表中,删除所有记录,再从临时表插入它们回来

使用某些应用逻辑:仅选择每个多行中的一个,删除表中的所有内容,然后重新插入单个的行。


0
尝试这个: SELECT DISTINCT pagetitle,id,FROM cms_site_content
使用PHP从上述SQL保存所有ID到idlist,然后执行: DELETE FROM cms_site_content WHERE id NOT in ($idlist)
您需要将上述SQL语句转换为PHP / MySQL代码。

你可以不用 PHP,只使用纯 SQL 就能完成这个。 - nkr
是的,其他帖子更简单。 - Frank He

-2

试一下这个

DELETE t1 FROM table t1, table t2 WHERE t1.id > t2.id AND t1.name = t2.name

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接