【问题标题】:How do I rename duplicates in MySQL using PHP or just a MySQL如何使用 PHP 或仅使用 MySQL 重命名 MySQL 中的重复项
【发布时间】:2011-11-29 02:30:54
【问题描述】:

到目前为止,尝试使用该代码重命名 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 结果是 Anna1111111111111111111111111111111111111111111....等

如何在以下公司中重命名

Anna
Anna1
Anna2

【问题讨论】:

标签: php mysql sql rename


【解决方案1】:

如果我没有错过什么,你可以创建一个存储过程,使用游标迭代抛出你的行,如下所示:

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;

【讨论】:

  • 哇,真的很复杂,一定有一个简单的方法可以做到这一点,类似于上面写的 cetver,但不起作用
  • @user974435 这并不复杂,但这是遍历 mysql 表行的唯一方法,我认为在 php 中这样做会更容易,或者最好考虑使用 Auto_increment 列。
【解决方案2】:

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:=@counter+1)); 

【讨论】:

    【解决方案3】:

    也许你可以使用模数来产生编号,像这样(SQLite 示例,但在 mysql 中应该类似):

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

    您只需要翻译rowid 和模函数,两者都在mysql 中可用。

    然后你可以CONCAT你想要的结果。

    【讨论】:

    • 这个只显示所有记录?
    • 您可以使用它来填充额外的列,然后连接,或使用JOIN。我只是告诉你如何做到这一点。
    【解决方案4】:
    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
    

    【讨论】:

    • #1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 14 行的“ THEN
    • 这不是解决方案。这是算法。
    猜你喜欢
    • 2020-04-30
    • 2011-10-30
    • 1970-01-01
    • 2012-03-24
    • 2015-04-13
    • 2017-10-04
    • 2012-12-12
    • 2011-03-23
    • 2013-05-01
    相关资源
    最近更新 更多