【发布时间】:2010-11-22 06:19:31
【问题描述】:
我有一个表格,我可以在其中保存所有曾经发生的行更改。问题是在应用程序的开头有一个错误,它会为每一行制作一堆副本。
表格如下所示:
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
CID 在表副本中是唯一的。
我想要的是删除 DATA GROUP BY ID 的所有重复项,这些重复项依次按 CID 排序。
正如您在表格中看到的,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
有什么建议吗? :)
我认为我的问题被问得很糟糕,因为每个人似乎都认为最好的答案给出了这样的结果:
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 |
CID 252227 和 CID 438158 是重复的,但因为 CID 381530 在它们之间;我想保留这个。在按 CID 和 ID 排序时,只有重复项是一个接一个。
【问题讨论】:
-
在您的最终结果集中,
(2, 2)和(2, 7)之间也没有id 1。这是否意味着它们也应该被删除?如果不是,它们的区别是什么? -
他们之间没有 ID 1,但他们有 (2, 5, DA)。 ID 应该被忽略为“重复”数据,它应该用于将行分组在一起。谈论两个 ID 可能会让人分心。如果您查看最后一张表,您只会看到一个 ID 以及仅来自该 ID 的预期结果。
-
(1, 1)和(1, 4)在它们之间有一个DO。那你为什么要删除(1, 4)呢? -
如果您采用 ID = 1 的条目序列(CID 的升序),您有:(1, 1, DA), (1, 4, DA), (1, 6,达)。由于这些行中的 ID 和 DATA 值相同,因此只保留“重复”中的第一个。同样,对于 ID = 2,序列为:(2, 2, DO), (2, 3, DO), (2, 5, DA), (2, 7, DA)。 CID = 3 和 CID = 2 的行中的 ID 和 DATA 值相同,应删除 CID = 3; CID = 5 的行在 DATA 中具有不同的值(与 CID = 2 相比),应为 ke[t,CID = 7 的行与 CID = 5 相比在 DATA 中具有不同的值,应保留。
-
Quassnoi:因为“DO”不是来自同一个 ID。查询应始终按 ID 分组。
标签: php sql mysql duplicates duplicate-removal