Actualice solo el primer registro de entradas duplicadas en MySQL

¡Problema resuelto!

Actualizar:

No del todo lo que necesito, hagamos un ejemplo en una tabla simple con los campos ID, NOMBRE, CUBIERTA

Tengo 100 entradas con 100 nombres, algunos de los nombres están duplicados, pero solo deseo actualizar primero de los duplicados.


¿Tratando de actualizar todas las primeras filas de todos los duplicados en la base de datos, realmente difícil de hacer, alguna idea de cómo puedo hacerlo? A continuación se muestra el código que estoy tratando de reconstruir, pero este código reemplaza cada 1er con el último para todos los duplicados.

Esquema, cómo quiero que funcione a continuación

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; 

No está claro en absoluto lo que quieres. Quizás esto:

 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 ; 

Para esta pregunta (y futura), tenga en cuenta que cuando escribe una pregunta:

 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 

Use una subconsulta como criterio de selección:

 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) 

Hice esto recientemente en PostgreSQL. ¿Estás en posición de usar una tabla temporal? Si es así, para cada conjunto duplicado, inserte la clave principal MIN () en su tabla temporal, y luego realice su ACTUALIZACIÓN usando una cláusula where usando los PK en la tabla temporal.

Editar: siguiendo tu comentario, aquí hay algo que hice recientemente.

 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; 

Puedes cambiar ‘oid’ por tu clave principal (¡mi problema era que la tabla no tenía clave principal!). También lo más importante es la cláusula where en la ACTUALIZACIÓN, por lo que solo se actualizan algunas filas. Tendrá que cambiar MAX () por MIN (), y por supuesto cambiar las filas a las que están en su caso de uso. Tenga en cuenta que esto es para PostgreSQL, pero el enfoque debería ser muy similar.