Как переименовать дубликаты в MySQL, используя PHP или просто MySQL - PullRequest
1 голос
/ 01 октября 2011

пытается переименовать дубликаты в базе данных 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 Анн, результат - Анна1111111111111111111111111111111111111111111 .... и т.д.

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

Anna
Anna1
Anna2

Ответы [ 4 ]

2 голосов
/ 01 октября 2011

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

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;
1 голос
/ 13 мая 2015

С Определяемыми пользователем переменными

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)); 
0 голосов
/ 01 октября 2011
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
0 голосов
/ 01 октября 2011

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

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

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

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

...