2012-02-11 17 views
7

Tengo una tabla con dos columnas - artista, release_idBuscar duplicados en la misma tabla en MySQL

Qué puedo ejecutar la consulta para mostrar los registros duplicados?

p. Ej. mi mesa es

ArtistX : 45677 
ArtistY : 378798 
ArtistX : 45677 
ArtistZ : 123456 
ArtistY : 888888 
ArtistX : 2312 
ArtistY: 378798 

La consulta debería mostrar

ArtistX : 45677 
ArtistX : 45677 
ArtistY : 378798 
ArtistY : 378798 

Respuesta

23

Puede usar una agrupación en las columnas de interés para determinar si hay duplicados.

SELECT 
    artist, release_id, count(*) no_of_records 
FROM table 
GROUP BY artist, release_id 
HAVING count(*) > 1; 
2

puede intentar algo como esto

select artist, count(*) from mytable group by artist having count(*) > 1; 

wich emitiría

artist count(*) 
45677 2 
378798 2 
0
SELECT id,artist,COUNT(id) as found FROM table GROUP by id HAVING found > 1 
3
SELECT id,artist,COUNT(*) FROM myTable 
GROUP BY artist, release_id HAVING COUNT(*) > 1 
2
SELECT row, COUNT(row) AS num FROM mytable GROUP BY row HAVING (num > 1); 
0
SELECT artist, count(*) 
FROM tableName 
GROUP BY artist 
HAVING count(*) > 1; 
0

Prueba esto:

SELECT A.ARTIST,A.RELEASE_ID FROM ARTISTS A 
WHERE EXISTS(
SELECT 'X' FROM ARTISTS B 
WHERE B.ARTIST = A.ARTIST AND B.RELEASE_ID = A.RELEASE_ID 
GROUP BY B.ARTIST,B.RELEASE_ID 
HAVING COUNT(B.ARTIST)>1) 
ORDER BY A.ARTIST; 
2

SELECT artista, release_id, count (*) no_of_records, GROUP_CONCAT (id) FROM tabla GROUP BY artista, release_id HAVING recuento (*)> 1;

también al agregar group_concat (id) obtiene todos los identificadores de los duplicados.

1

puede usar esta consulta para obtener el mismo resultado. funciona para mí

apellido SELECT, apellido, list.address DE lista INNER JOIN (SELECT dirección de la lista GROUP BY de dirección que tiene el recuento (id)> 1) DUP EN list.address = dup.dirección

1

seleccione * de la tabla donde el artista IN (seleccione artista del grupo de tablas por artista que tenga count (ID)> 1) y release_id IN (seleccione release_id IN del grupo de tabla por release_id having count (release_id)> 1);

buscará: ArtistX: 45677 ArtistX: 45677 ArtistY: 378798 ArtistY: 378798

-1

Si usted tiene la columna más único en una fila, se puede utilizar este:

DELETE FROM table WHERE id in(
    SELECT x.id 
    FROM ( 
     SELECT *,count(id) cc FROM table group by col1,col2,col3... 
    ) x 
    WHERE x.cc>1 
) 
0

Este método puede no ser ideal para ti, pero si alguna vez quieres deshacerte de los duplicados y hacer esto mientras te aseguras de que son duplicados, de verdad puedes probar esto:

  1. duplicar su table1 en table2, por ejemplo como este:

    CREATE tabla2 TABLA AS SELECT * FROM tabla1;

  2. añadir una nueva columna a table1, por ejemplo, el nombre que Kount

  3. ejecuta una consulta (esto supone release_id debería una única columna): tabla1

    Update como t1 SET t1.kount = (SELECT COUNT (*) a partir de Tabla2 AS t2 DONDE t1.release_id = t2.release_id)

  4. tabla de la gota table2

  5. uso table1. Kook para encontrar sus duplicados y eliminarlos o algo así. Preferiblemente en PHP/Python/Perl. De esta manera, puedes, por ejemplo, asegurarte de que sean realmente duplicados y solo tener el mismo release_id. El mismo release_id puede darse por accidente y los títulos, los años de publicación, etc. pueden ser diferentes. Así que sólo hay que poner aquí el código para filtrar los duplicados (pseudocódigo):

    foreach (SQL (SELECT * FROM tabla1 DONDE Kount> 1)) // qué hacer algo

Cuestiones relacionadas