我在MySQL有一张桌子:
不应该有重复的。是否可能有一个sql查询来查找、复制和删除它们(保留第一个匹配未删除)?
更新复制将具有相同的lang_original、lang_target和word (只有这3个字段)。
发布于 2011-12-12 17:41:41
创建一个新表比较简单。以前的答案是好的,但我喜欢这样:为"lang_original,lang_target,word“创建一个具有唯一键的新表。
CREATE TABLE new_table_can_be_renamed_later (
..your-fields...
UNIQUE unique (lang_original,lang_target,workd)
);然后通过选择旧表填充新表,并在插入中使用忽略
INSERT IGNORE INTO new_table_can_be_renamed_later
SELECT * FROM original_table请考虑Mysql文档的正确语法。
发布于 2011-12-08 03:45:50
可以像这样工作:
DELETE FROM tbl
WHERE EXISTS (
SELECT *
FROM tbl t
WHERE (t.lang_original, t.lang_target, t.word)
= (tbl.lang_original, tbl.lang_target, tbl.word)
AND tbl.id_word > t.id_word
)如果@Jason是正确的,而且MySQL不允许引用delete表,下面是另一个独立工作的表单:
DELETE FROM tbl
USING (
SELECT min(id_word) AS min_id, lang_original, lang_target, word
FROM tbl t
GROUP BY lang_original, lang_target, word
HAVING count(*) > 1
) x
WHERE (tbl.lang_original, tbl.lang_target, tbl.word)
= ( x.lang_original, x.lang_target, x.word)
AND tbl.id_word > x.min_id这两个变体都保留了最小的id,并杀死了其余的。
如果您想首先将所有的翻译保存到一组dupes中最小id的单词:
UPDATE tbl SET translation = all_trans
FROM (
SELECT min(id_word) AS min_id, group_concat(translation) AS all_trans
FROM tbl
GROUP BY lang_original, lang_target, word
HAVING count(*) > 1
) t
WHERE tbl.id_word = t.min_id发布于 2011-12-08 03:45:58
我不确定你能不能做到。你最好做的事情是
select distinct * into yournewtable from originaltable也许能行。
https://stackoverflow.com/questions/8425865
复制相似问题