PHP-删除具有相同引用的重复值

3

我有一个名为store的MySQL表格如下:

id ref item_no supplier
1  10    x1      usa
2  10    x1      usa
3  11    x1      china
4  12    x2      uk
5  12    x3      uk
6  13    x3      uk
7  13    x3      uk

现在我期望的输出结果如下:
id ref item_no supplier
1  10    x1      usa
3  11    x1      china
4  12    x2      uk
5  12    x3      uk
6  13    x3      uk

您可以看到,item_no x1x3 具有相同的引用和供应商来源,因此我想删除重复记录,以保留一个item_no

我创建了这个PHP代码来仅选择结果:

$query1 = "SELECT 
                DISTINCT(item_no) AS field, 
                COUNT(item_no) AS fieldCount, 
                COUNT(ref) AS refcount 
            FROM 
                store 
            GROUP BY item_no HAVING fieldCount > 1";

$result1 = mysql_query($query1);

if(mysql_num_rows($result1)>0){
    while ($row1=mysql_fetch_assoc($result1)) {
        echo $row1['field']."<br /><br />";
    }
} else {
    //IGNORE
}

在创建DELETE查询之前,如何告诉查询根据我的需求正确地选择SELECT重复记录。

谢谢大家


1
可能是在MySQL中删除除一个之外的所有重复行?的重复内容。 - Alex Andrei
3个回答

2
您可以使用以下查询来生成所需的结果集:
SELECT t1.*
FROM store AS t1
JOIN (
   SELECT MIN(id) AS id, ref, item_no
   FROM store
   GROUP BY ref, item_no
) AS t2 ON t1.id > t2.id AND t1.ref = t2.ref AND t1.item_no = t2.item_no 

这里有演示

要执行DELETE操作,可以使用以下命令:

DELETE t1
FROM store AS t1
JOIN (
   SELECT MIN(id) AS id, ref, item_no
   FROM store
   GROUP BY ref, item_no
) AS t2 ON t1.id > t2.id AND t1.ref = t2.ref AND t1.item_no = t2.item_no 

谢谢您的回答,我会尝试您告诉我的代码。我很快就会回复。 - Ali Hamra
我已经尝试了,但它没有选择重复的。它列出了所有的 item_no。还有,为什么你选择 id?如果 ref 和 supplier 相同,我希望选择它们。 - Ali Hamra
@AliHamra SELECT 查询选择了除了重复项以外的全部内容。我以为这就是你的意图。 - Giorgos Betsos
哦,我的错,我想要相反的。我想要列出重复项。 - Ali Hamra
@AliHamra 我已经测试了代码,并且它可以使用你的示例数据。你也可以在答案中查看我包含的 fiddle 演示。 - Giorgos Betsos
显示剩余2条评论

1
要仅查找重复记录,您可以使用:

 SELECT * FROM store WHERE id NOT IN 
 (SELECT id FROM store AS outerStore WHERE id = 
 (SELECT MAX(id) FROM store AS innerStore 
 WHERE outerStore.ref = innerStore.ref AND 
 outerStore.supplier = innerStore.supplier AND outerStore.item_no = innerStore.item_no))

也许有点长,但应该可以正常工作。

无论查询语句有多长,它本身是正确的,但输出为空记录 :( 我不明白为什么。 - Ali Hamra
好的,我猜我找到了问题所在...如果我从你的代码中删除 outerStore.ref = innerStore.ref AND outerStore.supplier = innerStore.supplier AND,它可以工作,但不是我期望的...它只会列出重复的项目。 - Ali Hamra
它在我的本地环境中使用您的数据可以运行。mysql_num_rows($result1)返回0? - Vlad Latish

0
如果您想选择要删除的行,请使用以下代码:
select *  from  store 
where id not in (
    select max(id)  from  store 
    group by  distinct ref, item_no, supplier);

或者您可以直接使用一个命令进行直接删除,如下:

delete from  store 
where id not in (
    select max(id)  from  store 
    group by  distinct ref, item_no, supplier);

谢谢您的回答,但它显示了MySQL错误“mysql_num_rows()期望参数1为资源.....” - Ali Hamra
我已经更新了答案,使用SELECT语句获取要删除的行候选项。 - ScaisEdge
根据你的代码看起来应该是可以工作的,但我仍然得到相同的mysql错误 :(。 - Ali Hamra
可能表名有误...我已经更新了答案...使用正确的表名。 - ScaisEdge

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