Mysql Mutliple列行重复,删除语句

时间:2015-07-24 19:15:39

标签: mysql

因此我无法让此声明正常工作。 我有一个包含4列的表:ID,CertID,GroupID,CompID。 随着时间的推移,数据库已经收集了一些重复的行,我的意思是在所有列上都是一个副本,而不包括ID字段,这是其键。

我总是试图在实际的DELETE语句之前使SELECT语句工作,这样我就不必恢复备份的数据库了。

这是我最近一直在尝试的事情:

SELECT u1.* FROM CertMain AS u1, CertMain AS u2 
WHERE u1.CertID = u2.CertID 
AND u1.GroupID = u2.GroupID 
AND u1.CompID = u2.CompID

但这似乎没有给我我想要的东西,感谢任何帮助谢谢

----------------------------------
| ID | CertID | GroupID | CompID |
|----|--------|---------|--------|
| 1  |   1    |    4    |   1    | <---Duplicate Row
| 2  |   1    |    4    |   3    | <---NOT A Duplicate Row (All 3 must match)
| 3  |   1    |    4    |   1    | <---Duplicate Row
| 4  |   8    |    3    |   5    |
| 5  |  10    |    1    |   1    |
---------------------------------- 

3 个答案:

答案 0 :(得分:1)

如何使用group by

select CertID, GroupID, CompID, group_concat(id)
from CertMain
group by CertID, GroupID, CompID 
having count(*) > 1;

这会将所有ID放在一行。

如果您想要实际行,请使用exists

select cm.*
from CertMain cm
where exists (select 1
              from CertMain cm2
              where cm2.certid = cm.certid and cm2.groupid = cm.groupid and
                    cm2.compid = cm.compid and cm2.id <> cm.id
             );

编辑:

如果你想把它变成MySQL中的delete,那就麻烦了。如果group by具有不错的表现,那么您可以这样做:

delete cm
    from CertMain cm  join
         (select CertID, GroupID, CompID, min(id) as minid
          from CertMain
          group by CertID, GroupID, CompID 
         ) cm2
         on cm2.certid = cm.certid and cm2.groupid = cm.groupid and
            cm2.compid = cm.compid and cm.id > cm2.minid;

在执行删除之前,您应该将当前表保存在另一个表中。另请注意,如果三个ID中的任何一个为NULL,这将无法正常工作。

答案 1 :(得分:0)

您可以使用connectHTTP(requests, completion: { (response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in NSLog(response) }) 子句来查找重复的行,如下所示:

exp_date = 1.day.ago.strftime("%a, %d %b %Y 00:00:00 GMT")
response.headers['Set-Cookie'] = "key%5Fmaquina=; path=/; domain='domain.com'; expires=#{exp_date};"

答案 2 :(得分:-1)

根据您目前的情况,您发现每一行都有自己的副本,其中u1.ID = u2.ID。 您需要比较u1.ID > u2.ID

SELECT u1.* FROM CertMain AS u1, CertMain AS u2 
WHERE u1.CertID = u2.CertID 
AND u1.GroupID = u2.GroupID 
AND u1.CompID = u2.CompID
AND u1.ID > u2.ID