2011-10-01 65 views
1

嘗試使用該代碼重命名MySQL數據庫中的重複項,但僅在名稱末尾添加1。所以,如果我有如何在MySQL中使用PHP重命名重複項或者僅使用MySQL

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個安納斯結果Anna1111111111111111111111111111111111111111111 ....等

我怎麼做它在以下INC重命名

Anna 
Anna1 
Anna2 
+0

'AUTO_INCREMENT '? http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html – Mob

+0

對於主ID是正確的,我說的是單獨字段中的重複名稱。 – user974435

回答

2

,如果我沒有錯過的東西,你可以做一個存儲過程迭代拋出使用光標做你這行如下:

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; 
+0

哇,真的很複雜,必須有一個簡單的方法來做到這一點,像上面寫的cetver類似的東西,但做的工作 – user974435

+0

@ user974435它並不複雜,但這是迭代你的mysql表的行的唯一方法我認爲它將更容易做到這一點在PHP或最好考慮使用Auto_increment列。 –

0

也許你可以使用模數來產生編號,就像這樣(SQLite的例子,但肩d是在MySQL類似):

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

所有你需要的是把rowid和模函數,在MySQL中都菱。

然後你可以按照你的願望CONCAT結果。

+0

這隻顯示所有記錄? – user974435

+0

你可以使用它來填充一個額外的列,然後concat或'JOIN'。我只給你一個想法如何做到這一點。 – szamil

0
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

不起作用:(其返回錯誤 – user974435

+0

#1064 - 您的SQL語法有錯誤;請查看與您的MySQL服務器版本相對應的手冊,以找到在<<最後一個字符是int>時使用的正確語法 THEN <在第14行用增量替換最後一個字符' – user974435

+0

這不是解決方案,這是算法 – cetver

1

隨着User-Defined Variables

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:[email protected]+1));