Duplikate Löschen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Duplikate Löschen

    Hello my Friends

    Ich möchte duplikate in meiner Tabelle löschen. Die Bedingung ist nur das ein Datensatz bestehen bleiben soll.
    Beispiel

    Ursprung:
    ID | Name
    1 | Seb
    2 | Möller
    3 | Holger
    4 | Willi
    5 | Seb

    Ziel:
    ID | Name
    1 | Seb
    2 | Möller
    3 | Holger
    4 | Willi

    Ob nun der Seb mit der id 1 oder seb mit der id 5 gelöscht wird ist nicht so wichtig.

    Mein SQl Statement sieht zurzeit so aus, funktioniert aber nicht richtig(löscht beide Datensätze)

    DELETE FROM Kunde AS alf WHERE (SELECT Count(*) FROM Kunde AS I GROUP BY Name
    Having Count(*)>1)>1
    AND
    alf.Name IN (SELECT I.Name FROM Kunde AS I GROUP BY Name
    Having Count(*)>1)
    Heut ist ein schöner Tag

  • #2
    DELETE FROM deineTabelle t1
    WHERE t1.ID in (SELECT t2.ID
    FROM deineTabelle t2
    WHERE t2.ID > t1.ID
    AND t2.`name` = t1.`name`)

    sollte helfen

    Kommentar


    • #3
      Hey ASP,
      sry die Idee war gut mit der ID, aber das funtzt ned, ich finde kein einzigen Datensatz egal ob duplikat oder nicht.

      Ich vermute es liegt daran das bei deinem SQL Statement nur Die Spalten von Tabelle t1 und Tabelle t2 Zeilenweise verglichen werden, und somit ist natürliuch die ID immer gleich und mit dem > find ich dann garnichts mehr.

      Wie ich das nun sehe ist es zu klären, wie man beim Delete die anzahl zu löschender Datensätze abfragen bzw. begrenzen kann
      Heut ist ein schöner Tag

      Kommentar


      • #4
        Gut dann mach mal so:

        PHP-Code:
        delete from Kunden where id in
                
        (select t2.id  from  Kunden t1 inner join Kunden t2 on t1.id>t2.id
                                    where t2
        .name t1.name

        Kommentar


        • #5
          Hey ASP,
          Vielen Dank das SQL Statement läuft.

          Leider hab ich nun nur ein weiteres Problem :

          Zurzeit läuft das sql statement ja auf die ID und ich kann den max bzw den min. Id Datensatz behalten:

          Wie kann ich folgendes Problem lösen, wenn ich den neuesten bzw den ältesten Datensatz beibehalten möchte(siehe Datum)?

          Beispiel:
          ID | Name | Datum | Anschrift
          1 | Seb | 01.01.2000 | sebastralt.
          2 | Meier | 01.01.2001 | Meierstr
          3 | Seb | 01.01.2002 | sebastrneuste.5
          4 | Muster | 01.01.2000 | Muster.
          5 | Seb | 01.01.2001 | sebastrmittel.

          Im Beispiel Möchte ich nun den Datensatz mit der ID 3 behalten, da dieser laut Datum der Aktuellste ist. (Die Duplikatenerkennen ist erneut nur auf den Namen)

          Vielen Dank im vorraus
          Heut ist ein schöner Tag

          Kommentar


          • #6
            **seufz** und wer hindert dich daran statt id, datum einzusetzen?

            Kommentar


            • #7
              Hey ASP,
              Ich hab befürchtet das diese antwortet kommen würde ... Leider hab ich das nicht farblich kenntlich gemacht ... Ehm

              ID | Name | Datum | Anschrift
              1 | Seb | [COLOR=red] 01.01.2000[/COLOR] | sebastralt.
              2 | Meier | 01.01.2001 | Meierstr
              3 | Seb | 01.01.2002 | sebastrneuste.5
              4 | Muster | [COLOR=red]01.01.2000 [/COLOR] | Muster.
              5 | Seb | 01.01.2001 | sebastrmittel.

              Das Datum feld ist kein eindeutiger Schlüssel und kommt verständlicherweise mehrmals vor ... (Es könnte ja auch sein das ein Duplikat zweimal mit dem selben Datum existiert)

              Folgendes Funktioniert nicht:

              SELECT DISTINCT ( t2.id)
              FROM Kunden AS t1 INNER JOIN Kunden AS t2 ON [COLOR=red](t1.datum>t2.datum AND t1.id>t2.id)[/COLOR]
              WHERE ( t2.name = t1.name and t2.Nachname=t1.Nachname);
              Heut ist ein schöner Tag

              Kommentar


              • #8
                und wer hindert dich wieder daran die ganze Information darüber zu liefern:

                1. was du wirklich löschen willst
                2. welche Spalten zu berücksichtigen sind

                wenn du nur tröpfchenweise herausrückst, kann man dir echt schlecht helfen. Außerdem habe ich dir die Richtung schon gezeigt. Etwas experiment-freudig sollst du auch sein, denn schließlich ist es dein Problem.

                Wenn du schon was vorher ahnt/fürchtest und trotzdem nichts sagst, muß ich mich fragen, ob ich mich gerade von dir habe verarschen lassen

                Kommentar


                • #9
                  Hallo asp2php,
                  Es tut mir leid für das Missverständniss. Ich hab kein interesse dich in irgendeiner weise zu veraschen oder zu ärgern.

                  Die Frage, wieso ich nicht gleich alle "Informationen" bzw. die gesamte Problematik schildere, ist berechtigt. Ich möchte mir mit diesem sowie mein letzten Beitrag über Duplikate "Basiswissen" mit dem Umgang von Duplikaten aneignen.

                  Etwas experiment-freudig sollst du auch sein ....
                  Am Anfang des Beitrags schrieb ich mein eigenes sql statement, welches nicht lief. Ich schrieb weiter das ich evt. eine Idee habe aber nicht weiß ob das mit sql bzw. mit mysql zu lösen ist. (Eine variable die mir die anzahl der zulöschende Rows zurückgibt) Daraufhin hast du mir dein fertiges SQL Statement gegeben. Dieses hab ich dann auch getestet und ein klein wenig erweitert(Distinct). Mir kam dann aber die Frage auf, wie könnte ich das sql statement nun so verändern das ich damit nicht nur die min oder max id beibehalte sondern halt max bzw. min datum. Ich habs dann ersteinmal ausprobiert, bin aber zur keiner lösung gekommen.

                  denn schließlich ist es dein Problem.
                  Natürlich hast du recht, es ist mein Problem. Aber ich dachte genau dafür ist ein Forum da. Leute zu fragen die einen Helfen können, bzw. mehr wissen haben. Wenn man alles selbst lösen soll, wieso wird dann eine Plattform für fragen bereitgestellt ....

                  Der Selfjoin ist recht "simpel", aber ich wär wohl nie drauf gekommen. Ich dachte die Problematik wäre mit einem subselect bzw mittels group by sowie dann ein order by zu lösen. Geht aber ja anscheinend nicht. Zumindest hab ich es bis jetzt noch nicht zum laufen bekommen ....

                  Ehm vielleicht war auch mein ausdruck "befürchtet" nicht die beste wahl meinerseits.
                  Aber ich muss leider sagen, ich schrieb alle zu benötigen Informationen im Beitrag, evt. nur nicht ausführlich genug:

                  (siehe Datum)?
                  (Die Duplikatenerkennen ist erneut nur auf den Namen)
                  Ich hoffe du versteht meine Problematik und erkennst das ich dich wirklich in keinster weise verarschen wollte.

                  bis denne
                  seba
                  Heut ist ein schöner Tag

                  Kommentar

                  Lädt...
                  X