【问题标题】:MySQL - Merge rows in table based on multiple criteriaMySQL - 根据多个条件合并表中的行
【发布时间】:2015-09-10 19:51:58
【问题描述】:

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

     ╔═════╦═══════╦═════╦═══════╗
     ║ 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 中执行此操作吗?

【问题讨论】:

  • 你的意思是当你查询它,还是更新那个表?
  • 我要更新表格。
  • 您最好将结果转储到临时表中(基于那里的一个答案),然后截断/转储此数据。

标签: mysql


【解决方案1】:

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

SELECT distinct name, age, grade 
into tempTable
from theTable

这将忽略 ID,只给你一个不同的转储,并进入一个新表。

然后您可以删除旧的 and 并重命名新的。或者截断旧的,然后将其转回。

【讨论】:

  • 从概念上讲,这是有道理的。我从未使用过INTOtempTable 在运行该命令之前是否必须存在?当我尝试时,我得到Undeclared variable: tempTable
  • 没有。实际上,表不应该首先存在。这将为您创建事物。列定义将根据您用于创建它的列自动创建。根据您的数据库,您可能需要使用模式命名表,例如“dbo.tempTable”。
  • 好的,也许这可以解释它:stackoverflow.com/questions/2949653/…。我正在使用 MariaDB。
  • 我没有意识到有区别。我已经编辑了我的问题以删除对 SQL 的引用,并将建议对您的答案进行编辑。
  • 好吧,这个问题已经被加分了,因为它看起来很有帮助。这里的 cmets 展示了我们是如何得出解决方案的——最多并包括两种不同的方法(在语法上)。因此,无需编辑。无论如何 - 很高兴能提供帮助......
【解决方案2】:

你可以像这样删除重复的地方:

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

【讨论】:

    猜你喜欢
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 2021-11-28
    • 1970-01-01
    相关资源
    最近更新 更多