MySQL删除具有相同列值的重复行

时间:2018-07-13 15:35:50

标签: mysql sql

我正在清理一些数据,我想通过查找具有相同“图片ID”和“日期”值的记录来删除重复的行:

示例:

picture_id - 2 date - "13-Jul-18"
picture_id - 2 date - "13-Jul-18"
picture_id - 2 date - "13-Jul-18"
picture_id - 2 date - "13-Jul-18"

DELETE FROM `pictures` WHERE `picture_id` = '2' AND `date` = '13-Jul-18'

表格列(按顺序):ID(主键),picture_id,日期,关注者

我只想删除重复记录中的一个,但只删除其中一个。哪一个都没关系。我该怎么做?

5 个答案:

答案 0 :(得分:2)

在MySQL中,您可以使用JOIN保留最小(或最大)的ID:

DELETE p
    FROM pictures p JOIN
         (SELECT p.picture_id, p.date, MIN(id) as min_id
          FROM pictures p
          WHERE p.picture_id = 2 AND p.date = '2018-07-13' 
          GROUP BY p.picture_id
         ) pp
         ON p.picture_id = pp.picture_id AND p.date = pp.date AND p.id > p.min_id;

答案 1 :(得分:1)

假设您不在乎保留的ID,则可以选择全部一条记录,然后删除所有未选择的记录

DELETE
FROM     pictures
WHERE    ID NOT IN (
                     SELECT 
                              ID
                     FROM     pictures
                     WHERE    picture_id = 2 AND
                              Date = '2018-07-13'
                     LIMIT 1
                    ) AND
         picture_id = 2 AND
         Date = '2018-07-13'

这些都是不必要的重复,这一事实使我认为您当前的主键不足以满足您的目的,或者您需要查看唯一的约束条件

答案 2 :(得分:0)

我认为:

delete 
from  pictures p
where id != (select min(id) 
             from   pictures p1
             where  p.picture_id = p1.picture_id
             and    p.date = p1.date)

应该有效,只要您提供了信息。

只要您具有唯一的主键,此功能就可以使用

如果要使用其他名称,请更改为max(id)
如果您想变得怪异,也可以选择rand(id)并限制1。

您的主键将不再是连续的,请考虑将来再检查插入时不需要的重复项。

答案 3 :(得分:0)

您可以尝试

DROP TABLE IF EXISTS  pictures;
CREATE TABLE pictures(picture_id INT(11), `dt` DATE, followers INT(11));
INSERT INTO pictures VALUES
(2,'2018-07-13',4553),
(2,'2018-07-13',4552),
(2,'2018-07-13',4557),
(2,'2018-07-13',4577),

(3,'2018-07-13',4355),
(3,'2018-07-13',4351),
(3,'2018-07-13',4353),
(3,'2018-07-13',4374);

删除查询

DELETE P FROM pictures p 
    LEFT JOIN (
        SELECT picture_id, dt, MAX(followers) AS fol 
        FROM pictures WHERE dt ='2018-07-13' GROUP BY picture_id
    ) AS main
ON main.dt = p.dt
WHERE main.picture_id = p.picture_id
AND main.fol  <>  p.followers;

我希望这能解决您的问题。

答案 4 :(得分:0)

仅使用公用表

     With CTE_Duplicates as
   (select picture_id ,date , row_number() over(partition by picture_id,date order by picture_id ,date ) rownumber 
   from `pictures` )
   delete from CTE_Duplicates where rownumber!=1

对我有用。请检查