Есть несколько похожих тем в 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 продуктов.
Если вы можете использовать PHP, я бы рекомендовал вам сделать это через PHP. Я не нашел способ сделать это с MySQL. Этот будет обновлять ВСЕ строки, имеющие count> 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) } }
Отказ от ответственности: не проверен! Сделайте резервную копию первым!
MySQL может это сделать.
Первый / простой запрос:
SELECT id, field, count(*) c from ... group by field having c >1
Второй запрос, модифицированный для получения идентификаторов для удаления:
SELECT instr(s,mid(s,',')+1) from ( SELECT group_concat(id) s, count(*) c from ... group by field having c >1)z
выглядит уродливым, но быстрым (средняя функция работает быстрее, чем не в (…)).
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
На самом деле. И лучше.