2014-06-23 3 views
1

Я хочу SQL Updation, что:запрос на обновление MySQL для повторяющихся записей

Предположим, я следующая таблица в базе данных MySQL

названия

ID титул
1 привет
2 привет
3 привет
4 SOMETEXT
5 привет
6 привет

Я хочу, чтобы эта таблица будет обновляться таким образом, что есть уникальные названия.

названия

ID название
1 Привет
2 hello1
3 привет
4 SOMETEXT
5 hi1
6 hello2

На самом деле я работаю по сценарию миграции где в ограничении Unique titles первоначально не использовалось.

ответ

1
update titles t 
inner join 
(
SELECT id, 
      title, 
      case when [email protected] then @curRank := @curRank + 1 else @curRank:=0 end, 
      @curTitle:=title, 
      @curRank as rank 
FROM  titles t, (SELECT @curRank := 0,@curTitle="") r 
ORDER BY title 
) t1 on t1.id = t.id 
set t.title = concat(t1.title,case when rank = 0 then "" else rank end) 
; 

Или же, вероятно, более эффективным способом было бы взять принять ответ Клубничный и превратить его в операторе UPDATE в аналогичной манере ....

Следовательно:

update titles t 
inner join 
(
SELECT x.id 
    , concat(x.title,CASE WHEN y.id IS NOT NULL THEN COUNT(y.id) ELSE "" END) newTitle 
from titles x 
    LEFT 
    JOIN titles y 
    ON y.title = x.title 
    AND y.id < x.id 
GROUP 
    BY x.id 
) t1 on t1.id = t.id 
set t.title = t1.newTitle 
; 
+0

Спасибо, Том .. Он отлично работает ... –

1
SELECT x.* 
    , CASE WHEN y.id IS NOT NULL THEN COUNT(y.id) ELSE '' END rank 
    FROM titles x 
    LEFT 
    JOIN titles y 
    ON y.title = x.title 
    AND y.id < x.id 
GROUP 
    BY x.id; 
+0

Не работает atleast в MySQL. И я хочу ОБНОВИТЬ НЕ ВЫБРАТЬ –

+0

Конечно, это работает. Бизнес, передающий это UPDATE (если вы уверены, что это то, что вы хотите!) Тривиально. – Strawberry

+0

Хорошо, что ваша логика работает. Я хотел обновить, вот и все ... –

Смежные вопросы