根据两个字段查找重复项并删除它们

时间:2015-06-15 01:25:27

标签: mysql sql

我有一个名为tourn_results的表,有多个记录共享相同的tournamentId

tourn_result记录集的示例

uniqueId tournamentId playerRank
1        111          1
2        111          2
3        111          3

4        222          1
5        222          2
6        222          3

7        333          1
8        333          2
9        333          3
10       333          4

11       111          1
12       111          2
13       111          3

每场锦标赛的成绩不能超过1 playerRank = 1 (每场锦标赛只有一个第一名)

我需要找到每个重复并删除它们,找不到合适的答案。感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

除了(uniqueidtournamentId)的每个组合playerRank以外,所有内容都会删除。{/ p>

delete from tourn_results x
where uniqueid <> ( select min(y.uniqueid)
                      from tourn_results y
                     where y.tournamentid = x.tournamentid
                       and y.playerrank = x.playerrank  );

答案 1 :(得分:0)

您可以在不希望重复的列上添加唯一索引。它将丢弃所有重复项。

ALTER IGNORE TABLE tourn_result ADD UNIQUE INDEX idx_name (tournamentId, playerRank);

另一个选项是创建一个新的临时表,插入重复的行并从实际表中删除它们。

答案 2 :(得分:0)

在MySQL中,使用left join

最容易做到这一点
delete tr
    from tourn_results tr left join
         (select tr2.tournamentid, min(uniqueid) as minui
          from tourn_results tr2
          where tr2.playerrank = 1
          group by tr2.tournamentid
         ) ttr
         on ttr.minui = tr.minui and ttr.tournamentid = tr.tournamentid
    where tr.playerrank = 1 and ttr.minui is null;

我不太确定删除第一名的额外“关系”是正确的做法。