sql

2013-01-31 20 views
5

Olası Çoğalt yinelenen kayıtları SİL nasıl
How to delete duplicate rows with SQL?sql

Ben kayıtlarıyla bir tablo var ve tüm yinelenen kayıtları silmek istediğiniz

DELETE FROM 'table' 
WHERE 'field' IN 
(
SELECT 'field' FROM 'table' GROUP BY 'field' 
HAVING (COUNT('field')>1) 
) 

Neden Bu çalışmıyor mu?

+0

Bir hata mesajı mı aldınız veya sorgu başarıyla çalıştırıldı mı? –

+1

sorgunuz kopyaları da dahil olmak üzere tüm alanları silemez miydi? Bu kimliğe sahip 2 kopyası varsa, IN() sorgunuz her ikisini de siler. En az bir kayıt tutmak istemiyor musun? – GGio

+2

mysql, veri seçeceğiniz bir tabloyu güncellemenize/silmenize izin vermez. –

cevap

5

Belki de bir alana dayalı olarak sadece benzersiz kayıtları seçmek için DISTINCT komutunu kullanarak keşfedebilirsiniz.

Benzersiz girişleri temel alan yeni bir tablo oluşturabilirsiniz. Örnek olarak ...

CREATE TABLE nonDuplicates 
SELECT DISTINCT * FROM yourTable group by field 
+1

Bu, yalnızca MySQL'in GROUP BY ile işlenmesi temelde yanlış olduğu ve bu geçersiz sözdizimine izin verdiği için çalışacaktır. Ama bu muhtemelen en hızlı çözümdür. –

+0

Teşekkürler Peixe iyi çalıştı! – vdhmartijn

+1

@vdhmartijn: anlamak için lütfen http://rpbouman.blogspot.de/2007/05/debunking-group-by-myths.html adresini okuyunuz * neden * MySQL'de çalışıyor ve neden diğer DBMS ifadesini reddediyor? geçersiz. –

1

Bu, birden fazla sonuç verir: -: Öncelikle kopyası almak ve dizide saklayabilirsiniz

SELECT TOP 1 field 
FROM `table` 
GROUP BY field 
HAVING (COUNT(field)>1 
+0

SELECT TOP 1 benim için çalışmıyor .. hala çalışmıyor – vdhmartijn

+0

Bu nasıl bir şey siler? –

0

SELECT field FROM `table` 
GROUP BY field 
HAVING (COUNT('field)>1 

deneyin bu chenge.

SELECT field 
FROM `table` 
GROUP BY field 
HAVING COUNT('field') > 1 

artık istediğiniz hangisi bir sonucu kaydetmek ve daha sonra

DELETE 
FROM `table` 
WHERE field IN (your values) AND field != savedID 
+0

Tepkiniz için teşekkürler, ancak amacım sadece PHP olmadan çalışmaktır. SQL – vdhmartijn

0

MySQL bir alt takılı/güncellenmiş siliniyor tabloyu kullanamaz çok iğrenç bir kısıtlama/sahiptir yürütmek için php yapmak -Select.

Ancak, silinecek tabloya (alt seçim kullanmak yerine) katılarak bu konuda çalışabilirsiniz. Bu kopyaların her biri için bir satır tutacak

DELETE d 
FROM table_with_duplicates d 
JOIN ( 
    SELECT min(id) as min_id, field 
    FROM table_with_duplicates 
    GROUP BY field 
) keep ON keep.field = d.field 
     AND keep.min_id <> d.id; 

(lowes ile: biri

Tablonuzdaki benzersiz tanımlayıcı bir tür varsayarsak (aşağıdaki açıklamada bir sütun id varsayıyorum) id sütununda değer).

tüm yinelenen satırları (en az bir tane tutmuyor) silmek isterseniz, AND keep.min_id <> d.id koşulunu kaldırmanız yeterlidir. Benzersiz bir sütun var, ama (en az bir satırda tutarak değil) tüm çiftleri kaldırmak istemiyorsanız

Düzenleme

, o zaman kullanabilirsiniz:

DELETE d 
FROM table_with_duplicates d 
JOIN ( 
    SELECT field 
    FROM table_with_duplicates 
    GROUP BY field 
    HAVING count(*) > 1 
) del ON del.field = d.field; 
+0

Ve eğer bir kimliğim yoksa, bunu çözmek için hala bir yol var mı? – vdhmartijn

+0

@vdhmartijn: ** Tüm ** kopyalarını silmek istiyorsanız (en az bir tane tutmuyorsa), kimliğiniz olmadan yapabilirsiniz. Aksi halde, peixe'nin cevabına bakınız. –

+0

Çalıştığınız için teşekkürler teşekkürler! – vdhmartijn