MySQL - 根据多个条件合并表中的行

时间:2015-09-10 19:51:58

标签: mysql

我想根据多个条件合并行,基本上删除重复项,我可以定义“重复”的含义。这是一个示例表:

     ╔═════╦═══════╦═════╦═══════╗
     ║ id* ║ name  ║ age ║ grade ║
     ╠═════╬═══════╬═════╬═══════╣
     ║  1  ║ John  ║ 11  ║   5   ║
     ║  2  ║ John  ║ 11  ║   5   ║
     ║  3  ║ John  ║ 11  ║   6   ║
     ║  4  ║ Sam   ║ 14  ║   7   ║
     ║  5  ║ Sam   ║ 14  ║   7   ║
     ╚═════╩═══════╩═════╩═══════╝

在我的示例中,假设我要在nameage上合并,但忽略grade。结果应该是:

     ╔═════╦═══════╦═════╦═══════╗
     ║ id* ║ name  ║ age ║ grade ║
     ╠═════╬═══════╬═════╬═══════╣
     ║  1  ║ John  ║ 11  ║   5   ║
     ║  3  ║ John  ║ 11  ║   6   ║
     ║  4  ║ Sam   ║ 14  ║   7   ║
     ╚═════╩═══════╩═════╩═══════╝

我并不特别在意id列是否已更新为增量,但我认为这样会很好。

我可以在MySQL中这样做吗?

2 个答案:

答案 0 :(得分:1)

我的建议,基于我的上述评论。

SELECT distinct name, age, grade 
into tempTable
from theTable

这将忽略ID,并且只为您提供一个不同的转储,并且只为新表提供。

然后你可以删除旧的,然后重命名新的。或截断旧的,然后将其转储回来。

答案 1 :(得分:1)

您可以像这样删除重复项:

delete test
from test 
inner join (
  select name, age, grade, min(id) as minid, count(*)
  from test
  group by name, age, grade
  having count(*) > 1
) main on test.id = main.minid;

示例:http://sqlfiddle.com/#!9/f1a38/1