Kode ini tidak berfungsi untuk MySQL 5.0, bagaimana cara menulis ulang untuk membuatnya berfungsi
DELETE FROM posts where id=(SELECT id FROM posts GROUP BY id HAVING ( COUNT(id) > 1 ))
Saya ingin menghapus kolom yang tidak memiliki id unik. Saya akan menambahkan bahwa sebagian besar waktu itu hanya satu id (saya mencoba sintaks in dan itu tidak berfungsi dengan baik).
SELECT id FROM posts GROUP BY id HAVING ( COUNT(id) > 1 )
DELETE p1 FROM posts AS p1 CROSS JOIN ( SELECT ID FROM posts GROUP BY id HAVING COUNT(id) > 1 ) AS p2 USING (id)
sumber
CROSS JOIN
tampaknya melakukan gabungan kartesian, jadi sepertinya ini mungkin melakukan pekerjaan yang tidak perlu, atau bekerja secara sub-optimal? Adakah yang bisa menjelaskan?USING
klausul. DenganUSING
perkalian terbatas pada pasangan yang memiliki nilai yang sama padaid
kolom, sehingga sangat terbatas.DELETE p1 FROM posts AS p1 INNER JOIN ( SELECT ID FROM posts GROUP BY id HAVING COUNT(id) > 1 ) AS p2 ON p2.ID=p1.ID
Anda dapat menggunakan gabungan dalam:
DELETE ps FROM posts ps INNER JOIN (SELECT distinct id FROM posts GROUP BY id HAVING COUNT(id) > 1 ) dubids on dubids.id = ps.id
sumber
Jika Anda ingin menghapus semua duplikat, tetapi satu dari setiap kumpulan duplikat, ini adalah salah satu solusinya:
DELETE posts FROM posts LEFT JOIN ( SELECT id FROM posts GROUP BY id HAVING COUNT(id) = 1 UNION SELECT id FROM posts GROUP BY id HAVING COUNT(id) != 1 ) AS duplicate USING (id) WHERE duplicate.id IS NULL;
sumber