Intereting Posts
есть ли способ изменить хэш без табличек радуги? curl POST-формат для CURLOPT_POSTFIELDS Неопределенный индекс при группировании и суммах в многомерном массиве «Предупреждение: невозможно изменить информацию заголовка – заголовки, уже отправленные« error предоставленный ресурс не является допустимым ресурсом SFTP SSH2 Ошибка загрузки изображения в Laravel 5 Как найти конкретное значение в многомерном массиве $ _SESSION? Примеры тестирования Zend_Rest_Controller Unit получение значения дополнительной столбцовой таблицы столбцов laravel Изменение текста кнопки «Добавить в корзину» в WooCommerce для элементов с вариациями Удаление строки из вывода php json Как объединить прозрачный PNG с изображением с помощью PHP? PHP, как я могу проверить, является ли файл mp3 или файлом изображения? Можно ли это сделать в запросе MySQL, или это нужно сделать в PHP? (серверный) Загрузка файлов не работает в среде Heroku

Переименование дубликатов строк в MySQL

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

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