Php 我怎样才能加上?’;ID";或;计数数字“;在「;mysql重复值“;
我有一个很大的数据库,名称表上有太多重复值。手动更新它们是不可能的。我试图制作一个程序来添加ID的最后一个值,并使表唯一,但失败了 如何使用php或mysql更新它们 这是一个包含重复值的表格示例。 有4个alex、2个shama和1个jenny的名字。Php 我怎样才能加上?’;ID";或;计数数字“;在「;mysql重复值“;,php,mysql,Php,Mysql,我有一个很大的数据库,名称表上有太多重复值。手动更新它们是不可能的。我试图制作一个程序来添加ID的最后一个值,并使表唯一,但失败了 如何使用php或mysql更新它们 这是一个包含重复值的表格示例。 有4个alex、2个shama和1个jenny的名字。 | ID | NAME | | 1 | alex | | 2 | alex | | 3 | shama | | 4 | jenny | | 5 | alex | | 6 | shama
| ID | NAME |
| 1 | alex |
| 2 | alex |
| 3 | shama |
| 4 | jenny |
| 5 | alex |
| 6 | shama |
| 7 | alex |
这就是我想要做的。
| 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 |
假设您的表中没有以点+数字结尾的名称,您可以使用以下更新查询:
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)
请看小提琴
编辑
如上所述,只有在没有以点和数字结尾的记录时,此解决方案才会起作用,例如,如果您有这些记录,它将失败:
alex
alex
alex.2
而且,您还可以使用此解决方案只修复记录一次。如果需要插入新记录,则不能再次启动此查询,但应使用如下插入查询:
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]*$'
(这是一个经过粗略修改的固定查询)
即使这使事情变得更复杂,我认为计算计数器比公开内部ID要好得多(名为alex.2
的帐户看起来比名为alex.78964
的帐户要好得多)
Fiddle是。坏主意,使用id列不要这样做。因为其他人有相同的名字而强迫人们更改他们的名字是系统的一个故障。您已经为每个名称设置了唯一的ID。使用该选项。例如,为什么不在id=5的行上更改
alex
alex@xxx.com亚历克斯。2@xxx.com因此,我必须使名称唯一。因此,选择id,name
并使用$name$id@xxx.com
相反,这是一项伟大的工作。我尝试了7-8个小时,但失败了。比你好多了。我不能投你的票。我是starter@Andrew请不要这样做,你会后悔的。5分钟前我的名声是1。我找到了一个办法让它成为15,我现在可以投票了,我做到了。你什么意思?@否决票为什么否决票?对帐户名、电子邮件等使用类似的内容是很常见的。我更喜欢使用$name$counter@xxx.com而不是$name$id@xxx.com,但这取决于手术。。。但是我认为答案是正确的。@Andrew您也可以看看这个问题:如果您需要在表修复后添加更多名称,它可能会对您有所帮助