2012-02-11 16 views
7

Ho una tabella con due colonne - artista, release_idTrova duplicati nella stessa tabella in MySQL

Che domanda posso correre per mostrare i record duplicati?

ad es. il mio tavolo è

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

La query dovrebbe mostrare

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

risposta

23

È possibile utilizzare un raggruppamento tra le colonne di interesse per risolvere eventuali duplicati.

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

si può provare qualcosa di simile

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

wich sarebbe uscita

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

Prova questo:

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

SELEZIONA artista, release_id, COUNT (*) no_of_records, group_concat (id) FROM tabella GROUP BY artista, release_id AVERE contare (*)> 1;

aggiungendo anche group_concat (id) ottiene tutti gli ID dei duplicati.

1

è possibile utilizzare questa query per lo stesso risultato. funziona per me

SELEZIONA nome, cognome, list.address FROM INNER JOIN (specificare indirizzo lista GROUP BY indirizzo AVERE count (id)> 1) DUP ON list.address = dup.indirizzo

1

selezionare * dalla tabella in cui artista IN (selezionare artista dal gruppo di tabelle per artista con conteggio (ID)> 1) e release_id IN (selezionare release_id dal gruppo di tabelle da release_id che ha il conteggio (release_id)> 1);

preleverà: ArtistX: 45677 ArtistX: 45677 Artisty: 378.798 Artisty: 378798

-1

Se si dispone di colonna più unico in una riga, è possibile utilizzare questo:

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

Questo metodo potrebbe non essere ottimo per te, ma se vuoi eliminare i duplicati e farlo assicurandoti che siano duplicati, puoi provare questo:

  1. duplicare il vostro table1 in table2, per esempio come questo:

    CREATE TABLE Table2 AS SELECT * FROM tabella1;

  2. aggiungere una nuova colonna per table1, ad esempio, il nome è Kount

  3. esegue una query (questo presuppone release_id dovrebbe una colonna unica):

    UPDATE table1 AS t1 SET t1.kount = (SELECT COUNT (*) FROM tabella2 AS t2 DOVE t1.release_id = t2.release_id)

  4. drop table table2

  5. uso table1 .kount per trovare i duplicati e rimuoverli o qualcosa del genere. Preferibilmente in PHP/Python/Perl. Ad esempio, puoi assicurarti che siano effettivamente duplicati e che tu abbia lo stesso release_id. Lo stesso release_id potrebbe essere dato per caso e titoli, anni di pubblicazioni, ecc. Potrebbero essere diversi. Quindi, basta inserire il codice qui per filtrare i duplicati (pseudocodice):

    foreach (SQL (SELECT * FROM tabella1 WHERE Kount> 1)) fanno // fare qualcosa

Problemi correlati