Как переименовать дубликаты в MySQL с помощью PHP или просто MySQL

пытаясь переименовать дубликаты в базе данных MySQL до сих пор с использованием этого кода, но это только добавление 1 в конец имени. Поэтому, если у меня есть

UPDATE phpfox_photo n JOIN (SELECT title_url, MIN(photo_id) min_id FROM phpfox_photo GROUP BY title_url HAVING COUNT(*) > 1) d ON n.title_url = d.title_url AND n.photo_id <> d.min_id SET n.title_url = CONCAT(n.title_url, '1'); Anna Anna Anna 

Результат:

 Anna Anna1 Anna11 

Когда я получил 200 Annas результат, это Anna111111111111111111111111111111111111111111111 …. и т. Д.

как это сделать, чтобы переименовать в следующем inc

 Anna Anna1 Anna2 

если я не пропустил что-то, вы можете сделать хранимая процедура, которая итерации бросает ваши строки с помощью курсоров, чтобы сделать это следующим образом:

 DECLARE counter INT DEFAULT 0; DECLARE num_rows INT DEFAULT 0; DECLARE offset INT; DECLARE title_urlvalue VARCHAR(50); DECLARE no_more_rows BOOLEAN; DECLARE ucur CURSOR FOR SELECT UPDATE phpfox_photo n JOIN (SELECT title_url, MIN(photo_id) min_id FROM phpfox_photo GROUP BY title_url HAVING COUNT(*) > 1) d ON n.title_url = d.title_url AND n.photo_id <> d.min_id; SET offset = 1; SET no_more_rows = TRUE; select FOUND_ROWS() into num_rows; OPEN ucur; uloop: LOOP FETCH ucur if counter >= num_rows then no_more_rows = False; endif INTO title_urlvalue; IF no_more_rows THEN CLOSE ucur; LEAVE uloop; END IF; update title_urlvalue = Concat(title_urlvalue,offset); SET offset = offset + 1; SET counter = counter + 1; END LOOP uloop; close ucur; 

С пользовательскими переменными

 SET @counter:=0; SET @title_url:=''; UPDATE phpfox_photo n JOIN (SELECT title_url, MIN(photo_id) min_id FROM phpfox_photo GROUP BY title_url HAVING COUNT(*) > 1) d ON n.title_url = d.title_url AND n.photo_id <> d.min_id SET n.title_url = IF(n.title_url <> @title_url, CONCAT(@title_url:=n.title_url, @counter:=1), CONCAT(n.title_url, @counter:=@counter+1)); 

Возможно, вы можете использовать modulo для создания нумерации, как это (пример SQLite, но должен быть аналогичным в mysql):

 SELECT *, (rowid % (SELECT COUNT(*) FROM table as t WHERE t.name = table.name ) ) FROM table ORDER BY name 

Все, что вам нужно, это перевести функцию rowid и modulo, доступную в mysql.

Затем вы можете получить результаты CONCAT по вашему желанию.

 UPDATE phpfox_photo n JOIN (SELECT title_url, MIN(photo_id) min_id FROM phpfox_photo GROUP BY title_url HAVING COUNT(*) > 1 ) d ON n.title_url = d.title_url AND n.photo_id <> d.min_id SET n.title_url = CASE WHEN <last char is int> THEN <replace last char with incremented last char> ELSE <string + 1> END