【问题标题】:Count duplicates and update table with a single query使用单个查询计算重复项和更新表
【发布时间】:2012-05-01 14:51:30
【问题描述】:

我有一张有几千条记录的表。 我想更新所有名字重复的记录 如何通过单个查询实现这一目标? 示例表结构:

Fname varchar(100)
Lname varchar(100)
Duplicates int

必须使用单个查询的重复总数更新此重复列。 如果不循环运行,这可能吗?

【问题讨论】:

  • 你能展示一些示例数据 想要的输出吗?

标签: php mysql sql


【解决方案1】:
update table as t1
inner join ( 
select
fname,
count(fname) as total
from table
group by fname) as t2
on t1.fname = t2.fname
set t1.duplicates = t2.total

【讨论】:

  • 抱歉!它似乎违反了该约束。很奇怪。
  • 我尝试了上面的查询,但无法查看结果。我有接近 200,000 条记录,过了一段时间它挂了,所以我不得不终止该进程。有没有办法限制记录?我只想测试上面的查询是否有 1000 条记录。
  • 在 group by 子句后添加限制子句并重试。您甚至可以尝试在 fname 字段上添加索引以加快查询速度。
  • 我添加了一个限制子句,但即使这样只是为了处理 1000 条记录,它需要几分钟并且没有完成,我不得不终止该进程。有什么方法可以加快这个过程?
  • 我无法处理 200,000 条记录。有什么方法可以做到这一点?
【解决方案2】:

我有一张有几千条记录的表。我想更新所有名字重复的记录如何通过单个查询来实现这一点?

您确定要存储所谓重复的数量吗?如果不是,这是一个相当简单的查询:

SELECT fname, COUNT(1) AS number FROM yourtable GROUP BY fname;

我不明白您为什么要存储该号码。如果插入了另一条记录怎么办?如果有记录被删除怎么办? “重复数”将保持不变,因此在第一次突变时会变得不正确。

【讨论】:

  • 是的,但我想查看重复的列表,然后删除我不需要的。因此,如果我处理所有重复项,它会更容易。我可能会在两周内运行一次这个“检查重复”过程。
  • 此外,您的查询不会按重复项列出,它只是列出所有记录。
  • @KrishnaIyer - 尝试添加有子句,即 HAVING COUNT(1) > 1 但如果最终目标是删除重复项,则需要额外的逻辑,因为这不会告诉您要“保留”哪条记录。
  • @KrishnaIyer 怎么样,不是偶尔执行一个查询来删除重复项,而是在数据库中选择一个 UNIQUE 约束?我的查询确实没有列出重复项,但就像@Leigh 提到的那样,HAVING COUNT(1) > 1 很容易解决。
  • 好点。 “一盎司的预防胜于一磅的治疗”:)
【解决方案3】:

先创建列,然后编写如下查询:

UPDATE table SET table.duplicates = (SELECT COUNT(*) FROM table r GROUP BY Fname/Lname/some_id)

也许这个其他 SO 会有所帮助?

How do I UPDATE from a SELECT in SQL Server?

【讨论】:

【解决方案4】:

您可能无法做到这一点。您无法更新您在同一查询中选择的同一个表。

【讨论】:

  • 是的,你可以。使用带自连接的多表更新语法(就像我在 this answer 中所做的那样)。
  • From dev.mysql.com/doc/refman/5.5/en/update.html "目前,您不能在子查询中更新表并从同一个表中进行选择。"
  • @ethrbunny 如果您不使用自加入黑客,则不会。如果你使用它,它是可能的。
猜你喜欢
  • 2013-01-01
  • 2017-10-10
  • 2020-02-25
  • 2021-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-06
相关资源
最近更新 更多