He leído todos los duplicados de preguntas/respuestas y he encontrado esto para ser el más relevante de respuesta:

INSERT IGNORE INTO temp(MAILING_ID,REPORT_ID) 
SELECT DISTINCT MAILING_ID,REPORT_IDFROM table_1
;

El problema es que quiero eliminar duplicados por col1 y col2, pero también desea incluir a la inserción de todos los otros campos de la table_1.

Traté de agregar todas las columnas pertinentes de esta manera:

INSERT IGNORE INTO temp(M_ID,MAILING_ID,REPORT_ID,
MAILING_NAME,VISIBILITY,EXPORTED) SELECT DISTINCT  
M_ID,MAILING_ID,REPORT_ID,MAILING_NAME,VISIBILITY,
EXPORTED FROM table_1
;


M_ID(int,primary),MAILING_ID(int),REPORT_ID(int),
MAILING_NAME(varchar),VISIBILITY(varchar),EXPORTED(int)

Pero se insertan todas las filas en temp (incluidos los duplicados)

Bien para una cosa, no utilice INSERT IGNORE en su caso, 2º –> ¿Cómo es tu db tabla?
puede usted dar muestra de los registros?
actualizado mi pregunta con los nombres de campo y tipos de

OriginalEl autor user838437 | 2013-01-15

6 Comentarios

  1. 16

    La mejor manera de eliminar filas duplicadas por varias columnas es la más simple:

    Añadir un índice ÚNICO:

    ALTER IGNORE TABLE your_table ADD UNIQUE (field1,field2,field3);

    El IGNORAR anterior se asegura de que sólo el primero encontrado fila se mantiene, el resto se descarta.

    (Usted puede dejar que el índice, si la necesidad futura de los duplicados y/o saber que no volverá a pasar).

    da error de sintaxis 🙁
    MUCHO más fácil que subconsultas correlacionadas.
    A partir de MySQL 5.7.4, el OMITIR la cláusula para MODIFICAR la TABLA se elimina y su uso produce un error.
    ¿hay una solución?
    en mysql 5.5 no es un error que puede estar presente. uso set old_alter_table=1 ver docs en: dev.mysql.com/doc/refman/5.5/en/alter-table.html Debido a un error relacionados con la Rápida Creación de un Índice (Bug #40344), ALTERAR IGNORAR la TABLA … AÑADIR ÍNDICE ÚNICO no elimina las filas duplicadas. El OMITIR la palabra clave es ignorado. Si todas las filas duplicadas existe, la operación falla con una entrada Duplicada de error. Una solución es establecer old_alter_table=1 antes de ejecutar un ALTER IGNORAR la TABLA … AÑADIR ÚNICO ÍNDICE de la declaración.

    OriginalEl autor guidod

  2. 4

    Primero tendrá que encontrar su duplicados mediante la agrupación en los dos campos con una cláusula having.

        Select identField1, identField2, count(*) FROM yourTable
            GROUP BY identField1, identField2
              HAVING count(*) >1

    Si este devuelve lo que usted quiere, usted puede utilizarla como una subconsulta y

      DELETE FROM yourTable WHERE field in (Select identField1, identField2, count(*) FROM yourTable
            GROUP BY identField1, identField2
              HAVING count(*) >1 )
    Se esta a mantener uno de los duplicados de las filas? (Quiero seguir, no a eliminar cualquier fila que se ha duplicado)
    Se va a eliminar todos los duplicados. Si desea mantener uno, puede seleccionar un máximo o mínimo de un campo que no son de la agregación. Una rápida en google activado stackoverflow.com/questions/3777633/…, que también enlaces a otras idénticas preguntas.
    ¿Qué pasa si la tabla sólo tiene 2 columnas y ambas columnas se agrupan, ¿cómo puedo evitar que se borren todos los duplicados?

    OriginalEl autor Scotch

  3. 2

    Si no podía conseguir lo que quería, entonces usted puede probar mi «vieja escuela» método:

    Primero, ejecute esta consulta para obtener los registros duplicados:

    select   column1,
             column2,
             count(*)
    from     table
    group by column1,
             column2
    having   count(*) > 1
    order by count(*) desc

    Después de eso, seleccione los resultados y pegar en el bloc de notas++:

    Encontrar y eliminar duplicados filas por dos columnas
    Encontrar y eliminar duplicados filas por dos columnas

    Ahora mediante el uso de buscar y reemplazar en la especialidad de el bloc de notas++ sustituirlos; la primera «eliminar» y luego «insertar» consultas como ésta (a partir de ahora, por razones de seguridad, mis valores serán AAAA).

    Nota especial: por Favor, asegúrese de otra nueva línea para el final de la última línea de los datos dentro de notepad++ porque regex coincidía con la de ‘\r\n’ al final de cada línea:

    Encontrar y eliminar duplicados filas por dos columnas

    Encontrar lo regex: \D*(\d+)\D*(\d+)\D*\r\n

    Reemplazar con cadena: delete from table where column1 = $1 and column2 = $2; insert into table set column1 = $1, column2 = $2;\r\n

    Ahora, finalmente, pegar las consultas a MySQL Workbench consulta de la consola y ejecutar. Verá sólo una de las ocurrencias de cada registro duplicado.

    Encontrar y eliminar duplicados filas por dos columnas

    Esta respuesta es para una relación tabla construida de las dos columnas sin ID. Creo que se puede aplicar a su situación.

    OriginalEl autor Bahadir Tasdemir

  4. 1

    siempre se puede obtener la primaria a los identificadores de la agrupación que los dos únicos campos de

    select count(*), id as count from table group by col a, col b having count(*)>1;

    y, a continuación,

    delete from table where id in ( select count(*), id as count from table group by col a, col b having count(*)>1) limit maxlimit;

    también puede utilizar max() en lugar de limit

    ¿qué hace el límite de maxlimit hacer?
    que se refiere a cuántas filas duplicadas desea eliminar
    usted no puede utilizar la misma tabla para la consulta anidada y la consulta de eliminación.

    OriginalEl autor Sudhanshu Jain

  5. 0

    Para Mysql:

    ELIMINAR t1 DE yourtable t1 INNER JOIN yourtable t2, DONDE t1.id < t2.id Y t1.identField1= t2.identField1 y t1.identField2= t2.identField2;

    OriginalEl autor Shashikant Sharma

  6. 0

    Esto funciona perfectamente en cualquier versión de MySQL, incluyendo 5.7+. También maneja el error You can't specify target table 'my_table' for update in FROM clause mediante el uso de un doble subconsulta anidada. Sólo se elimina UNA fila duplicada (la posterior) así que si tienes 3 o más duplicados, puede ejecutar la consulta varias veces. Es nunca elimina filas únicas.

    DELETE FROM my_table
    WHERE id IN (
      SELECT calc_id FROM (
        SELECT MAX(id) AS calc_id
        FROM my_table
        GROUP BY identField1, identField2
        HAVING COUNT(id) > 1
      ) temp
    )

    Necesitaba esta consulta porque quería añadir un índice ÚNICO en dos columnas, pero hubo algunas filas duplicadas que necesitaba para descartar en primer lugar.

    OriginalEl autor LStarky

Dejar respuesta

Please enter your comment!
Please enter your name here