如何在“mysql重复值”之后添加“ID”或“count number”

时间:2013-06-23 20:57:52

标签: php mysql

我有一个大数据库,NAME表上有很多重复值。无法手动更新它们。我试图制作一个程序,用于添加ID的最后一个值,并使表格独一无二,但我失败了。

如何用php或mysql更新它们?

这是一个包含重复值的表的示例。 有4个alex,2个shama和1个jenny名字。

| ID | NAME     |
|  1 | alex     |
|  2 | alex     |
|  3 | shama    |
|  4 | jenny    |
|  5 | alex     |
|  6 | shama    |
|  7 | alex     |

这就是我想要做的。

包括重复名称后带点的ID

| ID | NAME     |
|  1 | alex     |
|  2 | alex.2   |
|  3 | shama    |
|  4 | jenny    |
|  5 | alex.3   |
|  6 | shama.2  |
|  7 | alex.4   |

1 个答案:

答案 0 :(得分:0)

假设您的表格中不包含以点+数字结尾的名称,您可以使用此UPDATE查询:

UPDATE
  names INNER JOIN
  (SELECT   n1.id, n1.name, count(n2.id)+1 cnt
   FROM     names n1 INNER JOIN names n2
            ON n1.name=n2.name AND n1.id>n2.id
   GROUP BY n1.id, n1.name) s
  ON names.id = s.id
SET
  names.name = CONCAT(names.name, '.', s.cnt)

请参阅小提琴here

修改

如上所述,此解决方案仅在没有以点和数字结尾的记录时才起作用,例如,如果您有这些记录,它将失败:

alex
alex
alex.2

此外,您可以使用此解决方案修复记录仅一次。如果您需要插入新记录,则无法再次启动此查询,但您应该使用如下的INSERT查询:

INSERT INTO names (ID, Name)
SELECT  8,
        CONCAT('alex.',
          COALESCE(MAX(CAST(SUBSTR(Name, LENGTH('alex.')+1, 1) AS UNSIGNED)) + 1,'')
        ) AS Name
FROM    names
WHERE   Name RLIKE '^alex\.[0-9]*$'

(这是一个从这个answer获得的轻微修改和修复的查询。)

即使这会让事情变得复杂一些,我认为计算一个计数器要好得多,而不是公开内部ID(名为alex.2的帐户看起来比名为alex.78964的帐户要好得多...)。

小提琴是here