【问题标题】: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'
)
)