0

可能重复:
重命名sql中的重复数据

我必须清理一个表字段(article_title),创建一个新字段,其中重复的标题被更改为:

 id  |      title         |     new_title
 34  | My Duplicate Title | My Duplicate Title
 ...
 95  | My Duplicate Title | My Duplicate Title (2)

我使用了这个 mysql 查询,但它不起作用(所有等级都是 1):

 SET @rank := 0;

 SET @prev := NULL;

 SELECT @rank := IF(@prev = title, @rank + 1, 1) AS rank,
   id, IF(@rank>1, Concat(title, ' (', @rank, ')'), title), @prev := title
 FROM articles ORDER BY title ASC

我做错了什么?

4

2 回答 2

0
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;
于 2012-09-10T19:04:37.697 回答
0

我认为这是你最好只从 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

需要添加一些数据库连接代码,也许是一些事务提交等。但这会给你这个想法。

于 2012-09-10T18:06:59.927 回答