Переименовать дублирующиеся строки в MySQL - PullRequest
0 голосов
/ 21 ноября 2011

Есть некоторые похожие темы в 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 ]

1 голос
/ 21 ноября 2011

Если вы можете использовать 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)
    }
}

Отказ от ответственности: Не тестировалось! Сначала сделайте резервную копию!

0 голосов
/ 20 января 2015
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

На самом деле. И лучше.

0 голосов
/ 22 ноября 2011

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

выглядит уродливо,но быстро (средняя функция быстрее, чем не (...)).

...