我正在清理一些数据,我想通过查找具有相同“图片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,日期,关注者
我只想删除重复记录中的一个,但只删除其中一个。哪一个都没关系。我该怎么做?
答案 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
对我有用。请检查