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

これは、Python や PHP などから DB と対話し、SQL ではなく従来のプログラミング言語でロジックを実装する方がはるかに優れている場合の 1 つだと思います。

以前に見たタイトルのハッシュ テーブル/辞書 (元のタイトルをキーとして使用し、値として見た回数) を使用すると、これが簡単になります。

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接続コード、おそらくいくつかのトランザクションコミットなどを振りかける必要がありますが、これでアイデアが得られます.

于 2012-09-10T18:06:59.927 に答える
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 に答える