• 11-03-2022, 17:30:13
    #1
    Merhaba arkadaşlar forumdan baya yardımcı olan arkadaş sayesinde sistemimi oluşturup kullanıma sundum. Ancak yaşadığım problem şu;

    Form ile veritabanına post ile kayıt ekliyor kullanıcılar. Sayfa yönlendirmesi gerçekleşene kadar 50 kere basıp aynı içerikte mükerrer kayıt oluşturuyorlar. Websitemdeki puan sistemi de bu mükerrer kayıtları count edip puan veriyor kullanıcıya.

    1- Mevcut veri tablomda mükerrer kayıtları silmem gerekiyor. Örneğin;


    Aynı 8 sütununa sahip aynı kullanıcı form yanıt verene kadar 4-5 kez basmış. ve mükerrer kayıt oluşmuş. burada normalde tek puan alması gerekirken 6 puan almış.
    biraz google baktım ama sütun bazında mükerrer kayıt sorguları bulabildim. Aynı satır verilerini listeleyebileceğim bir sorgu bulamadım. Tek tek elle silmem çok zor 100.000 data var şu anda.

    2- problemi çözmek adına form gönderirken mükerrer tıklamayı nasıl engellerim?

    Yanıtlarınız için şimdiden teşekkür ederim.
  • 11-03-2022, 17:46:48
    #2
    <form action="" method="post" name="benimform">
           
                                                    
       <input type="text" name="wallet" placeholder="Address" required="required" minlength="42" >    
                                          
    
         <input type="submit"  value="Add list" name="Addlist">
    
     </form>
    
    
    
    <p> <!--burada mesaj çıkacak kontrol sonrası -->
        
        <?php 
    
    if($_POST){
       ## Veritabanı bağlantısı
       try{
          $db = new PDO("mysql:host=localhost;dbname=aaaaaaaa;", "userrrrrr","siffffreee");
          
          
        
          
       }catch(PDOException $a){
          echo $a->getMessage();
       }
    
     ## aynı veri var mı kontrol
    
       $kontrol = $db->query("SELECT * FROM abcform WHERE sutunadi='{$_POST["sutunadi"]}'");
       ## kontrol için koşul belirttik.
       if( $kontrol->rowCount() == "0" ){
          $db->query("INSERT INTO abcform SET sutunadi='{$_POST["sutunadi"]}'");
          
          echo "Kayıt başarılı";
          
       }
       
       else{
          echo "Var bu dostum";
       }
    
    
    }
    
    
    ?>
        
    </p>
  • 11-03-2022, 17:48:57
    #3
    webteweb adlı üyeden alıntı: mesajı görüntüle
    <form action="" method="post" name="benimform">
          
                                                    
       <input type="text" name="wallet" placeholder="Address" required="required" minlength="42" >    
                                          
    
         <input type="submit"  value="Add list" name="Addlist">
    
     </form>
    
    
    
    <p> <!--burada mesaj çıkacak kontrol sonrası -->
        
        <?php
    
    if($_POST){
       ## Veritabanı bağlantısı
       try{
          $db = new PDO("mysql:host=localhost;dbname=aaaaaaaa;", "userrrrrr","siffffreee");
          
          
        
          
       }catch(PDOException $a){
          echo $a->getMessage();
       }
    
     ## aynı veri var mı kontrol
    
       $kontrol = $db->query("SELECT * FROM abcform WHERE sutunadi='{$_POST["sutunadi"]}'");
       ## kontrol için koşul belirttik.
       if( $kontrol->rowCount() == "0" ){
          $db->query("INSERT INTO abcform SET sutunadi='{$_POST["sutunadi"]}'");
          
          echo "Kayıt başarılı";
          
       }
      
       else{
          echo "Var bu dostum";
       }
    
    
    }
    
    
    ?>
        
    </p>
    kayıt eklemeyi hallederim bununla evet süper.
    Mükerrer mevcut kayıtlar hakkında bir önerin var mı?
  • 11-03-2022, 17:56:18
    #4
    Arifap adlı üyeden alıntı: mesajı görüntüle
    kayıt eklemeyi hallederim bununla evet süper.
    Mükerrer mevcut kayıtlar hakkında bir önerin var mı?
    SQL Mükerrer Kayıtlar Bulmak ve Silmek


    Mükerrer kayıtlar her zaman başımıza bela olmuştur ve hep bizlere sorun çıkartmışlardır. Bu yazımızda da bu sorunun önüne nasıl geçeceğimizi göreceğiz. Aslında önüne geçmek değil de nasıl temizleyeceğimizi göreceğiz. Mükerrer kayıtları engellemek pek mümkün olmuyor. Yani tablolara index ‘ler versek bile indexli kolonlar hariç kalan diğer kolonlar mükerrer çıkabilir. Yada kayıt işlemini yapmadan önce girilen kayıtlar ile aynısı olan kayıt varmı kontrolü gibi kontroller ile önüne geçmeye çalışabiliriz.


    Yol I – SQL Mükerrer Kayıtlar Bulmak ve Silmek

    Şimdi SQL de mükerrer kayıtları nasıl bulacağımızı görelim.


    -----------
    Select Kolon_Adi, Count(Kolon_Adi)
    From Tablo_Adi
    Group By Kolon_Adi
    Having Count (Kolon_Adi) &gt; 1
    -------------




    Bu sorgu bize Kolon_Adi verileri aynı olan verileri gösterecektir. Ama bunları silerken sorun yaşayabiliriz. Bu sebeple geçici olarak da olsa kolona bir ID kolonu ekleyip, primary key yapalım ve 1,1 otomatik artan olarak ayarlayalım. Sonraki işlem olarak da yukarıdaki sorgumuzu düzenleyelim.

    -----------
    Select Kolon_Adi as KLN, Count(Kolon_Adi) as ADET , MAX(ID) as ID
    From Tablo_Adi
    Group By Kolon_Adi
    Having Count (Kolon_Adi) &gt; 1
    -------------


    Şimdi, bu şekilde mükerrer kolonlarımızı bulmuş olduk. Bu kayıtları silmek istiyor isek nasıl sileceğimize bakalım.
    Silme konusunda birden fazla örnek vereceğim.
    Öncelikle yukarıdaki örneğimize göre bir silme işlemi yapalım.

    NOT: Burada mükerrer kayıt olarak 2 mükerrer kayıt olarak düşünülür. Mükerrer kayıtlar 2 ‘den fazlaysa aşağıdaki silme işlemini kayıt kalmayana kadar tekrar tekrar çalıştırın.


    -------------

    Delete from Tablo_Adi where ID in (

    Select MAX(ID) as ID
    From Tablo_Adi
    Group By Kolon_Adi
    Having Count (Kolon_Adi) &gt; 1

    )

    Select Kolon_Adi as KLN, Count(Kolon_Adi) as ADET , MAX(ID) as ID
    From Tablo_Adi
    Group By Kolon_Adi
    Having Count (Kolon_Adi) &gt; 1

    ----------

    Örnekte gördüğünüz gibi DELETE işleminde where ID in ( ) dedik… Çünkü select sorgumuz bize mükerrer olan kayıtların 2. lerini yani mükerrer olanlarının ID’lerini veriyor. Nereden biliyoruz mükerrer olduklarını… Çünkü ilk kayıt gerçek, ikinci ve diğer kayıtlar mükerrer olarak anılır. Mantıken düşünürseniz, ilk girilen kayıt, sonradan girilen kaydın mükerreri olamaz değil mi? İkinci girilen kayıt, ilk girilen kaydın mükerreri olur. Yani ilk girilen orjinal ise, sonra girilen sahte olur. Mantık budur.



    Burada kayıtlar iki tane ise ikinci girilenleri, üç tane ise üçüncü girilenleri silinir. Mükerrer olanlar silindikten sonra bir select sorgusu ile kalan mükerrerleri göreceğiz. Hiçbir kayıt gelmediyse mükerrerler temizlenmiş demektir. Hala kayıt varsa da, gelen kayıtlar 2. mükerrer demektir. Yani aynı kayıttan 3 tane varmış


    Yol II – SQL Mükerrer Kayıtlar Silmek

    SQL Mükerrer Kayıtlar Bulmak ve Silmek işlemi bu kadardı. Ben hiç bakmayım sileyim derseniz de bir kaç farklı yöntem daha var.
    Burada vereceğim yöntem yukarıdaki yöntemin tersi diyebilirim.
    -------------

    Delete
    From Tablo_Adi
    Where ID Not In
    (
    Select MIN(ID)
    From Tablo_Adi
    Group By Kolon1, Kolon2, Kolon3
    )

    -------------

    Buradaki örnekte, mükerrer olmasını sağlayan her bir kolonu Group By kısmına yazmalısınız. Burada yukarıdaki örnekteki gibi mükerrer olanları görmezsiniz.

    Şöyle ki,
    ------------

    Select MIN(ID) , Kolon1, Kolon2, Kolon3
    From Tablo_Adi
    Group By Kolon1, Kolon2, Kolon3

    ---------------

    Bu sorguyu çalıştırdığınızda, Kolon1, Kolon2, Kolon3 adlı kolonlarında göre tüm tabloyu gruplamış olursunuz. ID kolonu gruplanamayacağı için, bulunan kayıtlar arasında mükerrer olanların en küçük ID’sini aldık. Kaç tane mükerrer olursa olsun tek satır olarak görünecektir. Şimdi az yukarıda ne demiştik, ilk örneğe göre tersten işlem yapan demiştik. Neden böyle dedik ona bakalım.

    Select sorgumuzda, orjinal kayıtların recnolarını aldık MIN(ID) diyerek. Bu sorguya göre delete işlemini tekrar görelim.
    ---------------

    Delete
    From Tablo_Adi
    Where ID Not In
    (
    Select MIN(ID)
    From Tablo_Adi
    Group By Kolon1, Kolon2, Kolon3
    )
    --------------

    Where ID Not In () kısmına dikkat edin. Burada ekranda gördüğümüz ID’ler dışında kalan tüm kayıtlar silinecektir. Yani mükerrer tüm kayıtları silecek.

    İlk yöntemimizde, orjinallere dokunmayıp mükerrerlere odaklanıyorduk.
    İkinci yöntemimizde ise orjinallere odaklaıp, orjinaller haricinde kalan tüm kayıtları siliyoruz.
  • 11-03-2022, 18:03:07
    #5
    webteweb adlı üyeden alıntı: mesajı görüntüle
    SQL Mükerrer Kayıtlar Bulmak ve Silmek, yazım ile sql eğitim setime devam ediyorum. Bu yazımda tablolalarımızdaki mükerrer kayıtları nasıl bulabileceğimizi ve silebileceğimizi göstereceğim.


    SQL Mükerrer Kayıtlar Bulmak ve Silmek


    Mükerrer kayıtlar her zaman başımıza bela olmuştur ve hep bizlere sorun çıkartmışlardır. Bu yazımızda da bu sorunun önüne nasıl geçeceğimizi göreceğiz. Aslında önüne geçmek değil de nasıl temizleyeceğimizi göreceğiz. Mükerrer kayıtları engellemek pek mümkün olmuyor. Yani tablolara index ‘ler versek bile indexli kolonlar hariç kalan diğer kolonlar mükerrer çıkabilir. Yada kayıt işlemini yapmadan önce girilen kayıtlar ile aynısı olan kayıt varmı kontrolü gibi kontroller ile önüne geçmeye çalışabiliriz.


    Yol I – SQL Mükerrer Kayıtlar Bulmak ve Silmek

    Şimdi SQL de mükerrer kayıtları nasıl bulacağımızı görelim.


    -----------
    Select Kolon_Adi, Count(Kolon_Adi)
    From Tablo_Adi
    Group By Kolon_Adi
    Having Count (Kolon_Adi) &gt; 1
    -------------




    Bu sorgu bize Kolon_Adi verileri aynı olan verileri gösterecektir. Ama bunları silerken sorun yaşayabiliriz. Bu sebeple geçici olarak da olsa kolona bir ID kolonu ekleyip, primary key yapalım ve 1,1 otomatik artan olarak ayarlayalım. Sonraki işlem olarak da yukarıdaki sorgumuzu düzenleyelim.

    -----------
    Select Kolon_Adi as KLN, Count(Kolon_Adi) as ADET , MAX(ID) as ID
    From Tablo_Adi
    Group By Kolon_Adi
    Having Count (Kolon_Adi) &gt; 1
    -------------


    Şimdi, bu şekilde mükerrer kolonlarımızı bulmuş olduk. Bu kayıtları silmek istiyor isek nasıl sileceğimize bakalım.
    Silme konusunda birden fazla örnek vereceğim.
    Öncelikle yukarıdaki örneğimize göre bir silme işlemi yapalım.

    NOT: Burada mükerrer kayıt olarak 2 mükerrer kayıt olarak düşünülür. Mükerrer kayıtlar 2 ‘den fazlaysa aşağıdaki silme işlemini kayıt kalmayana kadar tekrar tekrar çalıştırın.


    -------------

    Delete from Tablo_Adi where ID in (

    Select MAX(ID) as ID
    From Tablo_Adi
    Group By Kolon_Adi
    Having Count (Kolon_Adi) &gt; 1

    )

    Select Kolon_Adi as KLN, Count(Kolon_Adi) as ADET , MAX(ID) as ID
    From Tablo_Adi
    Group By Kolon_Adi
    Having Count (Kolon_Adi) &gt; 1

    ----------

    Örnekte gördüğünüz gibi DELETE işleminde where ID in ( ) dedik… Çünkü select sorgumuz bize mükerrer olan kayıtların 2. lerini yani mükerrer olanlarının ID’lerini veriyor. Nereden biliyoruz mükerrer olduklarını… Çünkü ilk kayıt gerçek, ikinci ve diğer kayıtlar mükerrer olarak anılır. Mantıken düşünürseniz, ilk girilen kayıt, sonradan girilen kaydın mükerreri olamaz değil mi? İkinci girilen kayıt, ilk girilen kaydın mükerreri olur. Yani ilk girilen orjinal ise, sonra girilen sahte olur. Mantık budur.



    Burada kayıtlar iki tane ise ikinci girilenleri, üç tane ise üçüncü girilenleri silinir. Mükerrer olanlar silindikten sonra bir select sorgusu ile kalan mükerrerleri göreceğiz. Hiçbir kayıt gelmediyse mükerrerler temizlenmiş demektir. Hala kayıt varsa da, gelen kayıtlar 2. mükerrer demektir. Yani aynı kayıttan 3 tane varmış


    Yol II – SQL Mükerrer Kayıtlar Silmek

    SQL Mükerrer Kayıtlar Bulmak ve Silmek işlemi bu kadardı. Ben hiç bakmayım sileyim derseniz de bir kaç farklı yöntem daha var.
    Burada vereceğim yöntem yukarıdaki yöntemin tersi diyebilirim.
    -------------

    Delete
    From Tablo_Adi
    Where ID Not In
    (
    Select MIN(ID)
    From Tablo_Adi
    Group By Kolon1, Kolon2, Kolon3
    )

    -------------

    Buradaki örnekte, mükerrer olmasını sağlayan her bir kolonu Group By kısmına yazmalısınız. Burada yukarıdaki örnekteki gibi mükerrer olanları görmezsiniz.

    Şöyle ki,
    ------------

    Select MIN(ID) , Kolon1, Kolon2, Kolon3
    From Tablo_Adi
    Group By Kolon1, Kolon2, Kolon3

    ---------------

    Bu sorguyu çalıştırdığınızda, Kolon1, Kolon2, Kolon3 adlı kolonlarında göre tüm tabloyu gruplamış olursunuz. ID kolonu gruplanamayacağı için, bulunan kayıtlar arasında mükerrer olanların en küçük ID’sini aldık. Kaç tane mükerrer olursa olsun tek satır olarak görünecektir. Şimdi az yukarıda ne demiştik, ilk örneğe göre tersten işlem yapan demiştik. Neden böyle dedik ona bakalım.

    Select sorgumuzda, orjinal kayıtların recnolarını aldık MIN(ID) diyerek. Bu sorguya göre delete işlemini tekrar görelim.
    ---------------

    Delete
    From Tablo_Adi
    Where ID Not In
    (
    Select MIN(ID)
    From Tablo_Adi
    Group By Kolon1, Kolon2, Kolon3
    )
    --------------

    Where ID Not In () kısmına dikkat edin. Burada ekranda gördüğümüz ID’ler dışında kalan tüm kayıtlar silinecektir. Yani mükerrer tüm kayıtları silecek.

    İlk yöntemimizde, orjinallere dokunmayıp mükerrerlere odaklanıyorduk.
    İkinci yöntemimizde ise orjinallere odaklaıp, orjinaller haricinde kalan tüm kayıtları siliyoruz.
    bu sonucu google'da görmüştüm ama KLN olarak adlandırdığı kısım kolon adı mı?
  • 11-03-2022, 18:10:06
    #6
    Arifap adlı üyeden alıntı: mesajı görüntüle
    bu sonucu google'da görmüştüm ama KLN olarak adlandırdığı kısım kolon adı mı?
    evet
    bunu bende googledan almıştım. (üşendim yazmaya)
  • 11-03-2022, 19:06:46
    #8
    benim tabloyu göz önünde bulundurarak örnek bir sorgu üretme şansın var mı?
  • 11-03-2022, 20:02:40
    #9
    hocam attığınız tabloda 8 değeri olanları user_id olarak unique bir değer olarak tanımladığınızı düşünüyorum şöyle bir şey yapabilirsiniz

    DELETE FROM tablo_adi WHERE satir_id NOT IN (SELECT MAX(satir_id) FROM tablo_adi GROUP BY user_id)