【问题标题】:PHP - Deleting duplicate values with same refPHP - 删除具有相同引用的重复值
【发布时间】:2016-09-06 21:04:31
【问题描述】:

我有以下名为 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 代码创建为仅SELECT 结果:

$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
}

如何将查询告诉SELECT 在创建DELETE 查询之前根据我的需要正确复制记录。

谢谢大家

【问题讨论】:

标签: php mysql select duplicates


【解决方案1】:

您可以使用以下查询来生成所需的结果集:

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 

Demo here

您可以使用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 

【讨论】:

  • 感谢您的回答,我会尝试您告诉我的代码。我会尽快回复
  • 我试过了,但它没有选择重复项。它列出了所有 item_no 。另外你为什么选择 id ?如果它们也相同,我想要参考和供应商
  • @AliHamra SELECT 查询选择所有重复项。我以为这是你的意图。
  • 哦,我的错,我想要相反的。我想列出重复项
  • @AliHamra 请检查我所做的编辑:t1.id &gt; t2.id 而不是 t1.id = t2.id
【解决方案2】:

如果要删除行的选择,请使用

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() expects parameter 1 to be resource .....
  • 我已经用 select 更新了答案,以便删除候选行
  • 根据您的代码,它似乎应该可以工作,但我仍然遇到相同的 mysql 错误 :( .
  • 可能tbale名称有错误..我已经更新了答案..用正确的表名
【解决方案3】:

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

 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))

可能很长,但应该可以。

【讨论】:

  • 不管它是否长,查询本身是正确的,但它输出空记录:(..我不明白为什么
  • 好的,我想我发现了问题所在。如果我从您的代码中删除outerStore.ref = innerStore.ref AND outerStore.supplier = innerStore.supplier AND,它可以工作,但不是我所期望的...它只列出重复的项目
  • 它在我的本地基地中使用您的数据。 mysql_num_rows($result1) 返回 0 ?
猜你喜欢
  • 2017-03-02
  • 2013-04-23
  • 1970-01-01
  • 2022-01-11
  • 2020-07-15
  • 2015-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多