Mysql 复制时更改字段

Mysql 复制时更改字段,mysql,Mysql,可能重复: 我必须清理一个表字段(article_title),创建一个新字段,其中重复的标题会发生如下更改: id | title | new_title 34 | My Duplicate Title | My Duplicate Title ... 95 | My Duplicate Title | My Duplicate Title (2) 我使用了这个mysql查询,但它不起作用(所有级别都是1): 我做错了什么?我认为这是一个非常

可能重复:

我必须清理一个表字段(article_title),创建一个新字段,其中重复的标题会发生如下更改:

 id  |      title         |     new_title
 34  | My Duplicate Title | My Duplicate Title
 ...
 95  | My Duplicate Title | My Duplicate Title (2)
我使用了这个mysql查询,但它不起作用(所有级别都是1):


我做错了什么?

我认为这是一个非常好的时机,你可以从Python或PHP或任何东西中直接与数据库对话,用传统编程语言而不是SQL实现逻辑

以前看到的标题的哈希表/字典(我只是使用原始标题作为键,被看到的次数作为值)将使这变得容易

Python伪实现:

# c and c2 are db.cursor() object
c.execute('select id, title from books')
seen = {}
for b in c:
  if seen.has_key(b[1]):
    seen[b[1]] += 1
    c.execute('update books set new_title = %s where id = %d',(b[1]+' ('+str(seen[b[1]])+')'))
  else:
    seen[b[1]] = 1

将需要添加一些DB连接代码,可能是一些事务提交等,但这会给您一个想法。

可能的重复项:&如果您有一个唯一的ID(或另一个唯一字段),则可以在括号(2)、(3)中设置数字依此类推,即具有相同标题但ID较小的记录数:第二个可能的副本包含基于存储过程的(长)解决方案。但是,我想知道为什么这个查询不能只用变量和/或如果我的解决方案中遗漏了什么…-1 OP没有指定任何服务器端语言。我觉得答案应该留在数据库中,同时建议一个服务器端的替代方案。适合这项工作的工具。我认为这不值得投否决票。我提出了一个可行的解决方案,甚至提供了代码。我的意思是,你也可以在纯SQL中使用触发器来纠正CMS,但你到底为什么要这样做呢?我想到了一个python脚本,但我只能通过phpMyAdmin访问这个远程数据库,我需要定期执行这个查询。我首先尝试SQL,因为使用python我必须在本地数据库中复制表,执行脚本,然后上载更改。虽然这增加了额外的难度,但您可以从PhpMyAdmin中导出csv,然后让python脚本逐行读取该表,而不是让它实际运行更新查询,让它写一个必要更新的文本文件,然后在PhpMyAdmin中作为大容量加载运行。这只在我手动插入各种重复子集时起作用。。。或者我遗漏了什么?不,这是一个测试用例。它使用重复标题,从“创建临时表…”开始,将“t”替换为“article_title”作为表名,并将其应用于您的案例。如何将重复标题自动插入临时表?insert语句就是这样做的。“自动”是什么意思?我需要先选择(并排列)重复项。我需要知道哪一个是重复的,并使用它们的增量id对它们进行“排序”(例如,第一个重复具有排名1,第二个重复具有排名2,依此类推)。如果我有这个,我可以用你的插入语句。
drop table if exists t;
drop table if exists t2;
create table t( id integer ,title varchar(50), new_title varchar(50));
insert into t (id, title) values (34, 'My Duplicate Title'), (95, 'My Duplicate Title');
create temporary table t2 (id integer, new_title varchar(50));
insert into t2 (id, new_title)
select id, concat( title, 
  ' (', 
    (select count(*) from t as tt where tt.title = t.title and tt.id > t.id), 
    ')' 
) from t;
update t, t2
set t.new_title = t2.new_title where t.id=t2.id;
drop table if exists t;
drop table if exists t2;
create table t( id integer ,title varchar(50), new_title varchar(50));
insert into t (id, title) values (34, 'My Duplicate Title'), (95, 'My Duplicate Title');
create temporary table t2 (id integer, new_title varchar(50));
insert into t2 (id, new_title)
select id, concat( title, 
  ' (', 
    (select count(*) from t as tt where tt.title = t.title and tt.id > t.id), 
    ')' 
) from t;
update t, t2
set t.new_title = t2.new_title where t.id=t2.id;