SQL:删除重复的行? (PHP)

时间:2017-02-11 14:26:18

标签: php mysql sql duplicates

我有以下数据库,并希望删除红色的数据库,因为它们是双倍的。所以如果另一行匹配pid,price,price_old,link和shop,我必须检查每一行。

但是我该如何检查呢?如何将其删除呢?

enter image description here

也许更简单的方法是从每行内的值生成一个id。因此,如果行内的值相等,则id也相等,并且只有一个值可与其他id进行比较。 这是一个更好的方法吗? - 如果是,我该怎么做?

问候!

4 个答案:

答案 0 :(得分:1)

事实上你没有办法得到你可以使用

添加uniqie id的不同行
ALTER TABLE my_table
 ADD id int NOT NULL AUTO_INCREMENT

一旦完成,您可以不使用id不是由您定义重复所需的值分组的最小值

delete from my_table 
where id  NOT in ( select min(id) from my_table
                  group by shop, link 
                  )

答案 1 :(得分:0)

最简单的方法是运行distinct查询:

select distinct pid, price, price_old, link, shop
from t;

您可以使用into创建新表格。这是最简单的方法。由于所有列都相同,因此MySQL不提供删除重复行的简单方法(同时保留其中一行)。

但是,您的当前结果可能是由查询生成的。如果是这样,您只需将select distinct添加到查询中即可。但是,最好修复查询,以便它不会生成重复项。如果是这种情况,请询问另一个问题,其中包含样本数据,所需结果(作为文本,而不是图像)以及您当前使用的查询。

答案 2 :(得分:0)

首先在测试表上测试:

DELETE t1 
FROM t t1, t t2 
WHERE t1.id > t2.id AND t1.price = t2.price 
    AND t1.link = t2.link AND t1.shop = t2.shop 
    AND t1.price_old = t2.price_old;

如果这些参数相等,基本上你要删除ID最高的那个

答案 3 :(得分:0)

select * from 
(select pid, price, price_old, link ,
row_number() over(partition by pid, price, price_old, link, shop order by pid) as rank
from my_table) temp
where temp.rank = 1

此查询将首先按所有列进行分组并对其进行排名。重复的行将具有等级>我们采取第一行或第二行并不重要,因为两者都是彼此的副本。我们只采用等级为1的行。不重复的行也将具有等级1,因此不会被忽略。

另一种方法是使用union。

select * from my_table UNION select * from my_table