Profil detayı eklendi, herkes profillerine girip bir gözatsın! Sevdiğiniz üyelerin cevaplarını takip edin! Tüm güncellemeler

MySQL Mükerrer Kayıtları Silmek #ÇÖZÜLDÜ

16.000 satırlık bir tablom var bu tabloda, yaklaşık 1000 kayıt birbiriyle aynı, tablo yapım şu şekilde

Tablo adı: blog

id (auto increment)

baslik

icerik

dosya_turu (varsayılan null)

boyut (varsayılan null


Ben bu yapıya göre; baslik, icerik, dosya_turu ve boyut alanlarını baz alarak bunlarla eşleşen kayıt var ise sadece id numarası en küçük olan yani en eski olan kayıt kalsın diğerleri silinsin istiyorum. Nasıl bir sorgu yazmalıyım ki aynı olan fazlalıkları temizleyebileyim?

Teşekkürler


//Sorunumu php kullanarak çözdüm.

$stmt = $db->query("SELECT id,baslik, count(*) AS tekrar
  FROM blog
  GROUP BY baslik, dosya_turu, boyut
  HAVING tekrar >1
  ORDER BY baslik ASC");

//$i=1;
while ($row = $stmt->fetch()) {

  $db->delete('blog')
  ->where('id', $row['id'])
  ->done();

  //echo $i.'-'.$row['baslik']."\n";

  //$i++;
}
1

Cevaplar (1)

İşlem devam ediyor, lütfen bekleyin..
Emre BÜYÜKDURMUŞ
@ebykdrms
1 ay önce [Güncellendi]

ÖNEMLİ: Silme işlemlerini yapmadan önce mutlaka veritabanınızın yedeğini alın. Hatalı bir sorgu çalışırsa (aşağıda yazdığım hiçbir sorguyu test etmedim) yedeğinizi geri yükleyebilmelisiniz...


Tekrar eden kayıtlar içinde id değeri en büyük olanların tablosunu getiren sorgu:

SELECT MAX(id), baslik, icerik, dosya_turu, boyut 
FROM blog
GROUP BY baslik, icerik, dosya_turu, boyut
HAVING COUNT(*)>1


Sadece tekrar eden kayıtlar içinde id değeri en büyük olanların id'lerini getiren sorgu:

SELECT MAX(id)
FROM blog
GROUP BY baslik, icerik, dosya_turu, boyut
HAVING COUNT(*)>1


id değeri 1 olan kaydı silen sorgu:

DELETE FROM blog
WHERE id = 1


id değeri 1, 2 ve 3 olan kayıtlar dışındaki tüm kayıtları silen korkunç sorgu:

DELETE FROM blog
WHERE id NOT IN (1,2,3)


Sizin istediğiniz şekilde; id değeri, sadece tekrar eden kayıtlar içinde id değeri en büyük olanların id'leriyle aynı olmayan tüm kayıtları silen sorgu:

DELETE FROM blog
WHERE id NOT IN (
    SELECT MAX(b.id)
    FROM blog as b
    GROUP BY b.baslik, b.icerik, b.dosya_turu, b.boyut
    HAVING COUNT(b.*)>1
)
Cevapla @OKANISIK1 ay önce
Cevap için teşekkür ederim şöyle bir hata alıyorum. Vermiş olduğunuz son kodu denediğimde;
Hata
SQL sorgusu: Belgeler


DELETE FROM blog
WHERE id NOT IN (
SELECT MAX(id)
FROM blog
GROUP BY baslik, icerik, dosya_turu, boyut
HAVING COUNT(*)>1
)
MySQL çıktısı: Belgeler

#1093 - Table 'blog' is specified twice, both as a target for 'DELETE' and as a separate source for data
Cevapla @ebykdrms1 ay önce
blog tablo adını iki kere kullanmışsınız diye bir hata. Herhalde içteki sorguda ayrım yapamadı. Cevabı güncelledim. Bir de böyle deneyin bakalım olacak mı...
Cevapla @ebykdrms1 ay önce
@OKANISIK, eğer bu da olmazsa dıştaki tablo için de as anahtarını kullanarak isim veririz.
Cevapla @OKANISIK1 ay önce
6.satır syntax hatası veriyor.
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '*)>1
)' at line 6

Php ile sorunumu çözdüm kodları da paylaştım. İlginize ve yardımlarınıza teşekkür ederim.
İşlem devam ediyor, lütfen bekleyin..

Cevap yaz Sadece sorunun cevabını yazın

Yabancı Dizi Arşivi