Fil*_*alm 2 php mysql sql duplicates duplicate-removal
我有一个表,我保存所有发生过的行更改.问题是,在应用程序的开头,有一个错误,每行都有一堆副本.
该表看起来像这样:
copies
|ID |CID |DATA
| 1 | 1 | DA
| 2 | 2 | DO
| 2 | 3 | DO (copy of CID 2)
| 1 | 4 | DA (copy of CID 1)
| 2 | 5 | DA
| 1 | 6 | DA (copy of CID 1)
| 2 | 7 | DO
Run Code Online (Sandbox Code Playgroud)
表副本中的CID是唯一的.
我想要的是删除按CID排序的所有DATA GROUP BY ID重复项.
正如您在表中看到的那样,CID 2和3是相同的,它们是相继的.我想删除CID 3.与CID 4和CID 6相同; 他们之间没有ID 1,是CID 1的副本.
重复删除后,我希望表格看起来像这样:
copies
|ID |CID |DATA
| 1 | 1 | DA
| 2 | 2 | DO
| 2 | 5 | DA
| 2 | 7 | DO
Run Code Online (Sandbox Code Playgroud)
有什么建议?:)
我认为我的问题很严重,因为每个人似乎认为最好的答案会给出这个结果:
ID | DATA | DATA | DATA | DATA | DATA | DATA | CID |
|Expected | Quassnoi |
1809 | 1 | 0 | 1 | 0 | 0 | NULL | 252227 | 252227 |
1809 | 1 | 0 | 1 | 1 | 0 | NULL | 381530 | 381530 |
1809 | 1 | 0 | 1 | 0 | 0 | NULL | 438158 | (missing) |
1809 | 1 | 0 | 1 | 0 | 1535 | 20090113 | 581418 | 581418 |
1809 | 1 | 1 | 1 | 0 | 1535 | 20090113 | 581421 | 581421 |
Run Code Online (Sandbox Code Playgroud)
CID 252227和CID 438158是重复的,但因为CID 381530介于它们之间; 我想保留这个.在通过CID和ID进行排序时,它只是彼此之后的重复项.
DELETE c.*
FROM copies c
JOIN (
SELECT id, data, MIN(copies) AS minc
FROM copies
GROUP BY
id, data
) q
ON c.id = q.id
AND c.data = q.data
AND c.cid <> q.minc
Run Code Online (Sandbox Code Playgroud)
更新:
DELETE c.*
FROM (
SELECT cid
FROM (
SELECT cid,
COALESCE(data1 = @data1 AND data2 = @data2, FALSE) AS dup,
@data1 := data1,
@data2 := data2
FROM (
SELECT @data1 := NULL,
@data2 := NULL
) vars, copies ci
ORDER BY
id, cid
) qi
WHERE dup
) q
JOIN copies c
ON c.cid = q.cid
Run Code Online (Sandbox Code Playgroud)
此解决方案会影响MySQL会话变量.
有一个纯粹的ANSI解决方案NOT EXISTS,但是,由于MySQL优化器的工作方式(它不会range在相关子查询中使用访问方法),它会很慢.
请参阅我的博客中的这篇文章,了解相关任务的性能详情:
| 归档时间: |
|
| 查看次数: |
1132 次 |
| 最近记录: |