合并具有不同ID但等效数据的MySQL行
我有一个“游戏”表,每个游戏都有不同的条目,如下所示:合并具有不同ID但等效数据的MySQL行,mysql,merge,whitespace,rows,matching,Mysql,Merge,Whitespace,Rows,Matching,我有一个“游戏”表,每个游戏都有不同的条目,如下所示: gameID internalName 1 game1 2 game 1 3 game 2 4 game2 5 game3 等等 所以,现在的问题是,我想结合一些情况,在这些情况下,去掉空格的游戏名称是相同的。在另一种情况下,gameID为2的行将与1合并并删除 此外,我想更新其他表中使用gameID作为外键的所有条目,以指向新键 我知道我可以做一些类似的事情,以获
gameID internalName
1 game1
2 game 1
3 game 2
4 game2
5 game3
等等
所以,现在的问题是,我想结合一些情况,在这些情况下,去掉空格的游戏名称是相同的。在另一种情况下,gameID为2的行将与1合并并删除
此外,我想更新其他表中使用gameID作为外键的所有条目,以指向新键
我知道我可以做一些类似的事情,以获得一份包含重复标题的列表:
SELECT gameID, count(REPLACE(internalName, ' ', '')), internalName FROM games GROUP BY REPLACE(internalName, ' ', '') HAVING count(REPLACE(internalName, ' ', '')) > 1
然而,这并不能真正帮助我实现我需要做的事情
有什么帮助吗?类似的东西可以帮助你开始
select g1.gameID as toKeep, g2.gameID toEliminate
from games g1
inner join games g2 on replace(g1.internalName, ' ', '') = replace(g2.internalName, ' ', '')
where g1.gameID < g2.gameID
但如果你有3个项目要合并,这将不会很好地工作
看
但是在一个存储过程中,或者在php或其他语言中,您应该能够得到您想要的东西
更好
有了这个,即使是3个、4个或5个相同的结果也会起作用
select g1.gameID as toKeep, g2.gameID toEliminate
from games g1
inner join games g2 on replace(g1.internalName, ' ', '') = replace(g2.internalName, ' ', '')
where g1.gameID < g2.gameID
and g1.gameID not in (SELECT g4.gameID
from games g4
inner join games g3 on replace(g3.internalName, ' ', '') = replace(g4.internalName, ' ', '')
where g3.gameID < g4.gameID)
EDIT:未经测试的存储过程示例
CREATE PROCEDURE CLEANGAMENAMES()
BEGIN
DECLARE toKeep, toEliminate INT;
DECLARE cur1 CURSOR FOR
SELECT g1.gameID AS toKeep, g2.gameID AS toEliminate
FROM games g1
INNER JOIN games g2 ON REPLACE(g1.internalName, ' ', '') = REPLACE(g2.internalName, ' ', '')
WHERE g1.gameID < g2.gameID
AND g1.gameID NOT IN (SELECT g4.gameID
FROM games g4
INNER JOIN games g3 ON REPLACE(g3.internalName, ' ', '') = REPLACE(g4.internalName, ' ', '')
WHERE g3.gameID < g4.gameID)
OPEN cur1;
read_loop: LOOP
FETCH cur1 INTO toKeep, toEliminate;
UPDATE <anyTable> set gameId = toKeep where gameId = toEliminate;
-- as many tables as you need
DELETE FROM games where gameID = toEliminate;
UPDATE games set internalName = REPLACE(internalName, ' ', '');
END LOOP;
CLOSE cur1;
END;
第2行将与第1行合并并删除是什么意思?具体来说,你所说的合并是什么意思?将第2行与第1行合并是否会以任何方式改变第1行?这不是真正的合并,而且会很痛苦,这取决于您拥有多少GameID外键。更糟糕的是,如果它们成为复合键的一部分。考虑到你有一次陷入这样的困境,我想介绍一个代理密钥并把它放在床上。谢谢你的帮助!以下是最终代码供参考: