doppelte Einträge löschen

rernanded

Erfahrenes Mitglied
Hi

ich möchte doppelte Einträge aus einer DB-Tabelle löschen. Problem ist, dass sich die Doppelung nur auf einen Teilstring bezieht.
So habe ich in der Spalte LINKS einmal Urls mit http und einmal mit https stehen. Der Unterschied besteht also lediglich im "s".

Ich möchte dann nur den Eintrag mit https stehen lassen und den Doppelten mit http löschen.

Beispiel:


1. http://www.beispielurl.com/
2. https://www.beispielurl.com/
3. http://www.beispielurl.de/

Nur 1. soll gelöscht werden bzw. 2. und 3. sollen erhalten bleiben.



Moni
 
Autsch! Per SQL wüsste ich es jetzt nicht wie ich es machen soll, aber mein erster Ansatz wäre:
1) Exportiere nach CSV (bzw. Excel)
2) Per Code durch die Tabelle rennen, und den Eintrag am "//" splitten, damit man 2 Felder bekommt (Protokoll - http(s) bzw. URL-"www.blablab.de")
3) Sortieren der Tabelle nach URL und als zweites Sortier-Kriterium nach Protokoll Absteigend (damit https vor http steht)
4) Bottom-Up durch die Tabelle rennen, und URL-Zelle mit URL-Zelle-1 (aktuelle Zelle mit der obendrüber) vergleichen, falls gleich, aktuelle Zeile löschen.
Somit hättest du nur http-Adressen, welche nur einmal vorkommen, bzw. https-Adressen, falls beide Varianten existieren.
5) Wieder zusammenbauen von Protokoll und URL ("//" hinzufügen)
6) Re-Import in die DB

Keine Ahnung wegen Primärschlüsseln etc. (müssten halt mitexportiert/sortiert werden).
 
@Zvoni Danke aber das Prozedere oder ein ähnliches will ich mir ja gerade ersparen. Der Vorteil ist vllt., die http und die https kommen je nur max. einmal vor. Es gibt also auch max. nur eine Doppelung, wovon die http gelöscht werden soll..
 
Hmmm, dann fällt mir nix anderes ein, als per RegEx (bzw. PATTERN-Funktion?) nach doppelten URL zu suchen, wenn der COUNT=2 ist, lösche http
 
Yeap. ;-))) Ev. ist das ganz simple. Ich sitze nur im Homeoffice und ständig geht das Telefon. Da fehlt die Ruhe mal zu denken.
 
Zuletzt bearbeitet:
Ich habe das hier als Lösung gefunden:

SQL:
DELETE FROM
    urls
WHERE id IN (
    SELECT
        id
    FROM (
        SELECT
            count(*) nr,
            domain
        FROM (
            SELECT
                REPLACE(SUBSTRING(url, LOCATE('://', url), 1000), '://', '') domain
            FROM
                urls
        ) as a
        GROUP BY
            domain
    ) as b
    RIGHT JOIN (
      SELECT
          id,
        SUBSTRING_INDEX(url,'://', 1) protocol,
        REPLACE(SUBSTRING(url, LOCATE('://', url), 1000), '://', '') domain2
      FROM
          urls
    ) as c ON domain2 = domain
WHERE
       nr > 1
   AND
       protocol = 'http'
);

Ist nicht gerade elegant (Ich bin auf eine elegantere Lösung gespannt)
aber mit diesen Testdaten klappts:


SQL:
CREATE TABLE urls (
   id   INT             NOT NULL AUTO_INCREMENT,
   url VARCHAR (40)     NOT NULL,
   PRIMARY KEY (id)
);

INSERT INTO urls (url) VALUES ('http://www.beispielurl.com/');
INSERT INTO urls (url) VALUES ('https://www.beispielurl.com/');
INSERT INTO urls (url) VALUES ('http://www.beispielurl.de/');
INSERT INTO urls (url) VALUES ('https://www.beispielurl.de/');
INSERT INTO urls (url) VALUES ('https://www.beispielurl.net/');
 
Zurück