chr*_*s85 2 mysql duplication subquery functions
我继承了一个缺乏唯一约束的数据库,因此数据被/被复制。我现在正在尝试删除重复的记录,然后添加一个约束来阻止这一点。
我有这个查询:
SELECT count(*) as dacount, substr(group_concat(id), (locate(',', group_concat(id))+ 1))
FROM `game`
group by matchid, ordinal
having dacount > 1
order by dacount desc
Run Code Online (Sandbox Code Playgroud)
这正确地给了id
我需要删除的行的s。但问题是,DELETE
由于dacount
withhaving
参数,我不能将其用作子查询。有没有另一种方法可以做到这一点?
这是我的计划:
DELETE FROM game WHERE id IN (SELECT count(*) as dacount, substr(group_concat(id), (locate(',', group_concat(id))+ 1))
FROM `game`
GROUP BY matchid, ordinal
HAVING dacount > 1)
Run Code Online (Sandbox Code Playgroud)
在 MySQL 的UPDATE
和实现中有关于自连接的限制DELETE
。这个问题通常可以通过使用连接来解决:
DELETE g.*
FROM game AS g
JOIN
( SELECT matchid, ordinal, min(id) AS id
FROM game
GROUP BY matchid, ordinal
-- HAVING count(*) > 1
) AS d
ON g.matchid = d.matchid
AND g.ordinal = d.ordinal
AND g.id > d.id ;
Run Code Online (Sandbox Code Playgroud)
在dbfiddle.uk测试。
另一种方法是使用LEFT JOIN
/IS NULL
构造:
DELETE g.*
FROM game AS g
LEFT JOIN
( SELECT min(id) AS id
FROM game
GROUP BY matchid, ordinal
) AS d
ON g.id = d.id
WHERE d.id IS NULL ;
Run Code Online (Sandbox Code Playgroud)
或者将EXISTS
子查询重写为JOIN
(删除所有存在相同matchid, ordinal
和较小游戏的游戏id
):
DELETE g.*
FROM game AS g
JOIN
game AS d
ON g.matchid = d.matchid
AND g.ordinal = d.ordinal
AND g.id > d.id
;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
921 次 |
最近记录: |