Intereting Posts
MYSQL находит, как разные текстовые поля? Структура таблицы laravel, показывающая наиболее понравившиеся статьи и меньше просмотров PHP: documentElement-> предупреждение childNodes Ошибка: предупреждение: создание объекта по умолчанию из пустого значения Как проверить частичное сходство двух строк в PHP Ошибка при рукопожатии WebSocket: неверное значение заголовка «Sec-WebSocket-Accept» с помощью PHP Как я могу отправить ответ json в контроллере symfony2 Как удалить таблицу MSSQL Datetime GETDATE () Столбцы, если они являются старыми или старыми с использованием PHP ВСТАВИТЬ в таблицу DB с подготовкой PDO и bindParam Какова альтернатива функции eval? хороший ресурс или книга для архивирования объектно-ориентированного программного обеспечения В * nix, что вызывает «спать» в верхней команде? Приложение Laravel 5.1 и home.blade.php отсутствуют JSON-данные из iOS в PHP-скрипт Ошибка синтаксиса PHP в настройке глобальной переменной

Обновить только первую запись из повторяющихся записей в MySQL

Задача решена!

Обновить:

Не совсем правильно, что мне нужно, давайте пример на простой таблице с идентификаторами полей, NAME, COVER

У меня есть 100 записей с 100 именами, некоторые из них дублируются, но я хочу только сначала обновить их из дубликатов.


Попытка обновить все 1-ю строки из всех дубликатов в базе данных, действительно трудно сделать это, любая идея, как я могу это сделать? Ниже приведен код, который я пытаюсь перестроить, но этот код заменяет каждый первый на последний для всех дубликатов.

Схема, как я хочу, чтобы она работала ниже

ID NAME COVER 1 Max 1 2 Max 0 3 Andy 1 4 Andy 0 5 Andy 0 UPDATE table t JOIN ( SELECT MinID, b.Name LatestName FROM table b JOIN ( SELECT MIN(ID) MinID, MAX(ID) MaxID FROM table GROUP BY tag HAVING COUNT(*) > 1 ) g ON b.ID = g.MaxID ) rs ON t.ID = rs.MinID SET t.Name = LatestName; 

Solutions Collecting From Web of "Обновить только первую запись из повторяющихся записей в MySQL"

Не совсем ясно, чего вы хотите. Возможно, это:

 UPDATE table AS t JOIN ( SELECT MIN(ID) MinID FROM table GROUP BY Name HAVING COUNT(*) > 1 ) AS m ON t.ID = m.MinID SET t.Cover = 1 ; 

Для этого (и будущего) вопроса, имейте в виду, когда вы пишете вопрос:

 1. a description of your problem, as clear as possible --- you have that 2. data you have now (a few rows of the tables) --- ok, nice 3. the code you have tried --- yeah, but better use same names --- as the data and description above 4. the error you get (if you get an error) --- doesn't apply here 5. the result you want (the rows after the update in your case) --- so we know what you mean in case we --- haven't understood from all the rest 

Использовать подзапрос в качестве критерия выбора:

 UPDATE table t SET t.Name = LatestName WHERE ID = (SELECT ID FROM table WHERE ( SELECT COUNT(DISTINCT(Name)) FROM table WHERE Name = 'duplicate' ) > 1 LIMIT 1) 

Я сделал это недавно в PostgreSQL. Вы можете использовать временную таблицу? Если это так, для каждого набора дубликатов вставьте первичный ключ MIN () в вашу временную таблицу, а затем выполните UPDATE, используя предложение where, используя PK в таблице temp.

Изменить: после вашего комментария, вот что я сделал недавно.

 CREATE TEMPORARY TABLE misc_updates ( temp_oid INTEGER, job INTEGER, run CHARACTER VARYING(8), quantity INTEGER ); INSERT INTO misc_updates (temp_oid, job, run, quantity) SELECT MAX(runjob.oid) temp_oid, runjob.job, runjob.run, SUM(runjob.quantity) sum_quantity FROM runjob INNER JOIN job ON (runjob.job = job.code) INNER JOIN (SELECT run, job FROM runjob GROUP BY run, job HAVING COUNT(*) > 1) my_inner ON (runjob.run = my_inner.run AND runjob.job = my_inner.job) GROUP BY runjob.job, runjob.run, job.quantity ; /* Do updates on one of the duplicated runjob rows */ UPDATE runjob SET quantity = mu.quantity FROM misc_updates mu WHERE runjob.oid = mu.temp_oid; 

Вы можете поменять «oid» на ваш первичный ключ (моя проблема заключалась в том, что в таблице не было первичного ключа!). Также критическим является предложение where в UPDATE, поэтому обновляются только некоторые строки. Вам нужно будет поменять MAX () на MIN () и, конечно, изменить строки на те, которые используются в вашем прецеденте. Имейте в виду, что это для PostgreSQL, но подход должен быть одинаков.