2017-04-14 3 views
1

現在のプロジェクトでMySqlサーバーを使用しており、移行を提供するのに役立つ必要があります。フィールド 'title'と 'alias'という名前の新しいフィールドを持つテーブル 'Patterns'があります。値はすべての行でNULLです。動的に決定された値を使用してテーブルを更新する

________________ 

|id|title|alias 
|1 |smile|null 
|2 |smile|null 
|3 |smile|null 
________________ 

がに変換する必要があります:たとえば

1) if title field is unique: just write it's value in alias 
2) if title is not unique: alias = title +'-'+ n , where n is number of occurrence 

:私は次のアルゴリズムを使用して、このフィールドに記述する必要が

________________ 

|id|title|alias 
|1 |smile|smile 
|2 |smile|smile-1 
|3 |smile|smile-2 
________________ 

それはSQLを使用してこのような結果を達成することが可能です、事前にお手数ですが

+0

質問を編集し、サンプルデータと望ましい結果を提供する必要があります(ただし、それは良い習慣です)。 –

答えて

0

これはMySQLの痛みです。あなたは変数を使ってそれを行うことができます。

select t.*, 
     (case when tt.cnt > 1 then concat(t.title, '-', rn) else t.title end) as new_title 
from (select t.*, 
      (@rn := if(@t = title, @rn + 1, 
         if(@t := title, 1, 1) 
         ) 
      ) as rn 
     from t cross join 
      (select @rn := 0, @t := '') params 
     order by title 
    ) t join 
    (select title, count(*) as cnt 
     from t 
     group by title 
    ) tt 
    on tt.title = t.title; 

多くの場合、シングルトンに "-1"を付けることができます。これにより、クエリが簡素化されます。

select t.*, 
     (case when rn > 1 then concat(t.title, '-', rn) else t.title end) as new_title 
from (select t.*, 
      (@rn := if(@t = title, @rn + 1, 
         if(@t := title, 1, 1) 
         ) 
      ) as rn 
     from t cross join 
      (select @rn := 0, @t := '') params 
     order by title 
    ) t ; 
関連する問題