hawkmaster: Gleiche Einträge finden

Hallo zusammen,
in einer mysql Tabelle gibt es Zeilen in der bei einer Spalte mehrfach das gleiche steht.
Zum bereinigen suche ich nun nach den gleichen Werten.

Wenn ich es so versuche:

  
SELECT `TextID`,`English`, TextIdentifier  
FROM texttbl  
GROUP BY `TextIdentifier`  
HAVING count( `TextIdentifier`) >1  

dann wird mir nur der Wert einmal angezeigt.
Ich suche aber etwas wie:
TextID English TextIdentifier
234    Super   super
567    Doll    super
789    Wow     super

Wie müsste die Abfrage heissen?

vielen Dank und viele Grüße
hawk

  1. Wie müsste die Abfrage heissen?

    Die IMHO schnellste Methode ist die Daten in eine neue Tabelle zu schreiben und dann die alte Tabelle löschen.

    1. Hallo suit,
      danke dir für deine Hilfe.

      Die IMHO schnellste Methode ist die Daten in eine neue Tabelle zu schreiben und dann die alte Tabelle löschen.

      du meinst eine neue Tabelle anlegen mit gleichen Spaltenanzahl und Bezeichnungen nur dann die Spalte "TextIdentifier" aus UNIQUE" setzten?

      oder habe ich dich falsch verstanden?

      vielen Dank und viele Grüße
      hawk

      1. oder habe ich dich falsch verstanden?

        Ich meinte nur einmalig die Tabelle in eine neue Tabelle übertragen. Wenn das System ordentlich funktioniert, sollte es doch zu keinen Dubletten kommen? Das entsprechende Feld Unique zu machen ist natürlich auch eine Möglichkeit - fragt sich dann natürlich, wozu die ID gut ist.

        1. Ich würde halt gerne vor dem Löschen alle gleichlautenden Einträge mit zugehöriger TextID finden damit ich diese mit meinem PHP Code vergleichen kann.

          vielen Dank und viele Grüße
          hawk

        2. echo $begrüßung;

          Das entsprechende Feld Unique zu machen ist natürlich auch eine Möglichkeit - fragt sich dann natürlich, wozu die ID gut ist.

          Eine ID ist ein Identifizierer ohne fachlichen Bezug. Eine eindeutige Spalte zusätzlich zur ID hingegen hat diesen zumeist.

          Ein Beispiel sei eine Tabelle für Anmeldenamen. Natürlich könnte man den eindeutigen Anmeldenamen als Identifizierer verwenden. Aber mitunter besteht der Wunsch, den Anmeldenamen zu ändern. Wenn weitere Tabellen bestehen, die den Anmeldenamen als Fremdschlüssel verwenden, hat man nun das Problem, alle anderen Vorkommen dieses Anmeldenamens ebenfalls ändern zu müssen. Verwendest du für die Beziehungsabbildung eine ID ohne fachliche Bedeutung, kannst du dir diese Kopfschmerzen sparen.

          echo "$verabschiedung $name";

  2. Hello,

    hast Du es schon  mal mit

    select distinct

    http://dev.mysql.com/doc/refman/5.1/de/select.html

    versucht?

    Liebe Grüße aus Syburg bei Dortmund

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. hast Du es schon  mal mit

      select distinct

      http://dev.mysql.com/doc/refman/5.1/de/select.html

      versucht?

      Wenn die Datensätze Dubletten darstellen, die sich aber in ihrer ID unterscheiden und man die ID der Doppelungen finden möchte, ist DISTINCT keine praktikable Möglichkeit.

      1. Hello,

        Wenn die Datensätze Dubletten darstellen, die sich aber in ihrer ID unterscheiden und man die ID der Doppelungen finden möchte, ist DISTINCT keine praktikable Möglichkeit.

        ja, sorry. Ich hatte es eben auch genau anders herum gelesen; dass hawkmaster die doppelte Ausgabe verhindern wollte und nur noch die Zeilen so haben wollte, wie dargestellt.

        Liebe Grüße aus Syburg bei Dortmund

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
  3. Hallo,

    in einer mysql Tabelle gibt es Zeilen in der bei einer Spalte mehrfach das gleiche steht.

    also nur in *einer* Spalte?

    dann wird mir nur der Wert einmal angezeigt.
    Ich suche aber etwas wie:
    TextID English TextIdentifier
    234    Super   super
    567    Doll    super
    789    Wow     super

    Nutze einen Join.

    Freundliche Grüße

    Vinzenz

    1. Hallo Vinzenz,
      danke auch dir für deine Hilfe.

      also nur in *einer* Spalte?

      ja nur die Spalte "TextIdentifier" hat bei manchen Zeilen gleich Einträge.

      Nutze einen Join.

      hmm, gute Frage, nur wie?
      meinst du ein SelfJoin?
      Habe sowas versucht aber das brachte nichts.

      SELECT
        KK1.TextID,
        KK1.English,
        KK1.TextIdentifier,
        KK2.TextID,
        KK2.English,
        KK2.TextIdentifier
      FROM texttbl AS KK1
      INNER JOIN texttbl AS KK2
      ON KK1.TextIdentifier = KK2.TextIdentifier
      HAVING count(KK1.TextIdentifier) >1

      vielen Dank und viele Grüße
      hawk

      1. Hallo,

        » also nur in *einer* Spalte?
        ja nur die Spalte "TextIdentifier" hat bei manchen Zeilen gleich Einträge.

        » Nutze einen Join.
        meinst du ein SelfJoin?

        nein, nicht ganz:

        Nehmen wir an, Deine Tabelle texttbl hätte folgenden Inhalt:

        TextID English TextIdentifier
        -----------------------------
        123    blau    blue
        234    Super   super
        567    Doll    super
        789    Wow     super

        Nun liefert

        SELECT
            TextIdentifier
        FROM
            texttbl
        GROUP BY
            TextIdentifier
        HAVING
            COUNT(TextIdentifier) > 1

        Dir als Ergebnismenge

        TextIdentifier
        --------------
         super

        Willst Du das von Dir anvisierte Ergebnis haben, so könntest Du einfach diese Abfrage mit der Tabelle selbst joinen:

        SELECT
            t1.TextID,
            t1.English,
            t1.TextIdentifier
        FROM (
            SELECT
                t2.TextIdentifier
            FROM
                texttbl t2
            GROUP BY
                t2.TextIdentifier
            HAVING
                COUNT(t2.TextIdentifier) > 1
        ) q1
        INNER JOIN
            texttbl t1
        ON
            q1.TextIdentifier = t1.TextIdentifier

        Genausogut könntest Du mit einer korrelierten Unterabfrage arbeiten:

        SELECT                                     -- Gib mir
            t1.TextID,                             -- die gewünschten
            t1.English,                            -- Spalten
            t1.TextIdentifier                      --
        FROM                                       -- aus
            texttbl t1                             -- meiner Tabelle,
        WHERE                                      -- jedoch nur die Datensätze,
            t1.TextIdentifier IN (                 -- deren TextIdentifier in der
                SELECT                             -- Liste
                    t2.TextIdentifier              -- der TextIdentifier
                FROM                               -- aus
                    texttbl t2                     -- meiner Tabelle enthalten sind,
                GROUP BY
                    t2.TextIdentifier
                HAVING                             -- die
                    COUNT(t2.TextIdentifier) > 1   -- mehr als einmal vorkommen.
            )

        Könnte Dein Ergebnis, wie folgt aussehen:

        IDs              Werte              TextIdentifier
        --------------------------------------------------
        234, 567, 789    Super, Doll, Wow   super

        wäre das viel einfacher, weil Du nur die Aggregatsfunktion GROUP_CONCAT benötigst:

        SELECT
            GROUP_CONCAT(TextID) IDs,
            GROUP_CONCAT(English) Werte,
            TextIdentifier
        FROM
            texttbl
        GROUP BY
            TextIdentifier
        HAVING
            COUNT(TextIdentifier) > 1

        Freundliche Grüße

        Vinzenz

        1. Hallo Vinzenz,

          oh man was bist du nur für ein Profi!
          vielen herzlichen Dank für deine tollen Tipps und Erklärungen.
          Ich werde mir das nochmals in Ruhe durchschauen und bei mir durchspielen.

          Und dann hoffe ich das ich es auch irgendwann mal kapieren werde :-)

          vielen Dank und viele Grüße
          hawk

        2. Hallo nochmals,

          ich habe das mal eben mit GROUP_CONCAT
          versucht weil ich das so noch nie gesehen hatte.

          Das ist ja klasse weil man nun auch die mehrfachen Werte der Spalte "English" sieht.
          Was ich jedoch nicht verstehe:
          Bei der TextID Spalte wird mir nicht die ursprüngliche ID angezeigt sondern etwas mit BLOB?
          [BLOB - 9 B] Color 1,Color 1   color1
          [BLOB - 9 B] Color 2,Color 2 color2

          Gruss
          hawk

          1. Hallo hawk,

            ich habe das mal eben mit GROUP_CONCAT
            versucht weil ich das so noch nie gesehen hatte.

            GROUP_CONCAT ist wirklich eine nette Aggregatsfunktion zur Verwendung mit GROUP BY; diese Funktion wünschte ich mir auch in manch anderem DBMS.

            Was ich jedoch nicht verstehe:
            Bei der TextID Spalte wird mir nicht die ursprüngliche ID angezeigt sondern etwas mit BLOB?

            [BLOB - 9 B] Color 1,Color 1   color1
            [BLOB - 9 B] Color 2,Color 2 color2

            Ja, da war ich etwas nachlässig :-(

            Bei GROUP_CONCAT greift die implizite Typkonvertierung, die z.B. bei CONCAT vorgenommen wird, von MySQL nicht, d.h. aus numerischen Werten werden nicht automatisch Zeichenketten. Infolgedessen musst Du die Umwandlung mittels der geeigneten Funktion selbst vornehmen:

            SELECT  
                [link:http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat@title=GROUP_CONCAT]([link:http://dev.mysql.com/doc/refman/5.0/en/cast-functions.html#function_cast@title=CAST](TextID AS CHAR)) IDs,  
                GROUP_CONCAT(English) Werte,  
                TextIdentifier  
            FROM  
                texttbl  
            GROUP BY  
                TextIdentifier  
            HAVING  
                COUNT(TextIdentifier) > 1  
            
            

            Bitte beachte auch die Hinweise zur maximalen Länge der resultierenden Zeichenkette im Handbuch.

            Freundliche Grüße

            Vinzenz

            1. yo,

              GROUP_CONCAT ist wirklich eine nette Aggregatsfunktion zur Verwendung mit GROUP BY; diese Funktion wünschte ich mir auch in manch anderem DBMS.

              bei oracle gibt es sie nicht als standard-funktion (vielleicht aus rechtlichen gründen), aber man kann sie die funktion selbst erstellen. dazu gibt es mehrere ansätze und funkioniert auch recht gut.

              Ilja