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种产品。
答案 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
实际上。更好。