重命名MySQL中的重复行

时间:2011-11-21 14:06:48

标签: php mysql duplicates

stackoverflow中有一些类似的主题,但我仍然没有成功重命名我的重复行:

CREATE TABLE IF NOT EXISTS `products` (
`product_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`product_code` varchar(32) NOT NULL,
PRIMARY KEY (`product_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;

INSERT INTO `products` (`product_id`, `product_code`) VALUES
(1, 'A'),
(2, 'B'),
(3, 'A');

此处第一行和第三行具有相同的项目。我只想添加一个像“复制”这样的后缀。结果将是:

product_id    product_code
-----------  --------------
    1               A
    2               B
    3            A Copy

那么如何在MySQL中解决这个问题呢?

编辑:以上数据就是一个例子。我的原始表有超过3000种产品。

3 个答案:

答案 0 :(得分:1)

如果您可以使用PHP,我建议您通过PHP来实现。我还没有找到一种方法来使用MySQL。这个将更新所有具有计数>的行。 1,包括原件。

UPDATE table
SET product_code = CONCAT(product_code, ' Copy')
GROUP BY product_code
HAVING COUNT(*) > 1

你不想要的。所以,如果你使用php,你可以这样做(假设你的表中行数很少(3000很好))

<?php
$result = mysql_query("SELECT * FROM table");
$rowsCnt = array();
while($row = mysql_fetch_assoc($result)){
    $rows[] = $row;
    $rowsCnt[ $row['product_code'] ]++;
}

foreach($rows as $index => $row) {
    if ($rowsCnt[ $row['product_code'] ] > 1) {
        mysql_query("UPDATE table SET product_code = '".mysql_real_escape_string($row['product_code'])." Copy' LIMIT ".($rowsCnt[ $row['product_code'] ] - 1)
    }
}

免责声明:未经测试!先备份!

答案 1 :(得分:0)

MySQL可以做到。

第一个/简单查询:

SELECT id, field, count(*) c from ... group by  field having c >1

第二个查询,修改了要删除的ID:

SELECT  instr(s,mid(s,',')+1) from (
SELECT group_concat(id) s, count(*) c from ... group by  field having c >1)z

看起来很丑,但速度很快(Mid功能性能比(...)更快)。

答案 2 :(得分:0)

SELECT  mid(s,instr(s,',')+1) as dubid from (
SELECT group_concat(id ORDER BY id ASC) s, count(*) c from `...` group by  field having c >1) as z

实际上。更好。