首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除MySQL上重复的行(至少留下一个行)

问删除MySQL上重复的行(至少留下一个行)
EN

Stack Overflow用户
提问于 2011-12-08 03:40:35
回答 3查看 1K关注 0票数 1

我在MySQL有一张桌子:

  • id_word
  • lang_original (原词的语言) VARCHAR(2)
  • lang_target (来自翻译的单词) VARCHAR(2)
  • word (单词本身) VARCHAR(50)
  • translation (翻译) VARCHAR(50)

不应该有重复的。是否可能有一个sql查询来查找、复制和删除它们(保留第一个匹配未删除)?

更新复制将具有相同的lang_original、lang_target和word (只有这3个字段)。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-12-12 17:41:41

创建一个新表比较简单。以前的答案是好的,但我喜欢这样:为"lang_original,lang_target,word“创建一个具有唯一键的新表。

代码语言:javascript
复制
CREATE TABLE new_table_can_be_renamed_later ( 
  ..your-fields...
  UNIQUE unique (lang_original,lang_target,workd)
);

然后通过选择旧表填充新表,并在插入中使用忽略

代码语言:javascript
复制
INSERT IGNORE INTO new_table_can_be_renamed_later 
  SELECT * FROM original_table

请考虑Mysql文档的正确语法。

票数 1
EN

Stack Overflow用户

发布于 2011-12-08 03:45:50

可以像这样工作:

代码语言:javascript
复制
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表,下面是另一个独立工作的表单:

代码语言:javascript
复制
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的单词:

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2011-12-08 03:45:58

我不确定你能不能做到。你最好做的事情是

代码语言:javascript
复制
select distinct * into yournewtable from originaltable

也许能行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8425865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档