我有一个名为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
(每场锦标赛只有一个第一名)
我需要找到每个重复并删除它们,找不到合适的答案。感谢您的帮助。
答案 0 :(得分:1)
除了(uniqueid
,tournamentId
)的每个组合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;
我不太确定删除第一名的额外“关系”是正确的做法。