Achim Schrepfer: Doppelte Datensätze in MySQL

Hallo Forumers,

ich habe ein kleines Problemchen mit einer MySQL-Tabelle. Die Tabelle enthält zwei Spalten user_id und grp_id. Gibt es eine möglichkeit, doppelte oder mehrfach vorkommende Datensätze in einer solchen Tabelle auf einfache Weise zu entfernen?

Vielen Dank und viele Grüsse,
Achim

  1. Hallo Achim,

    Ja, diese SQL-Abfrage liest die Daten aus einer Tabelle (alte_tabelle) und schreibt das Ergebnis der Abfrage in eine andere Tabelle (neue_tabelle). DISTINCTROW sorgt dabei dafür das nur eindeutige Datensätze (also keine doppelten) ausgewählt werden. So ist neue_tabelle eine dublettenfrei Kopie von alte_tabelle

    SELECT DISTINCTROW [alte_tabelle].* INTO [neue_tabelle]
    FROM [alte_tabelle];

    Paul

    1. Hi,

      SELECT DISTINCTROW [alte_tabelle].* INTO [neue_tabelle]
      FROM [alte_tabelle];

      danke, das war es was ich brauchte.

      Viele Grüsse,
      Achim

      1. Hallo!

        Eine Frage am Rande:

        SELECT DISTINCTROW [alte_tabelle].* INTO [neue_tabelle]
        FROM [alte_tabelle];

        SELECT 'blalba'  .  'blabla'  INTO  'blabla'  FROM  'blabla'

        Das hab ich ja noch nie gesehen! Ich dachte in MySQL geht immer nur eine Abfrage??? Was ist das?
        Grüße
         Andreas

        1. Hallo!

          Eine Frage am Rande:

          SELECT DISTINCTROW [alte_tabelle].* INTO [neue_tabelle]
          FROM [alte_tabelle];

          SELECT 'blalba'  .  'blabla'  INTO  'blabla'  FROM  'blabla'

          Tja, SQL ist eine Script-sprache, da geht eben ne ganze Menge ;-)

          Was glaubst Du wohl, wie groß meine Augen dreinglotzten, als ich als alter C/C++ - Entwickler das erste Mal die Stringbehandlungen von PERL/PHP bzw. auch der UNIX-Shells gesehen hatte. Ich konnte es auch erst überhaupt nicht glauben, daß sowas geht. In C gibt es dafür teilweise umständliche Funktionen. Z.B. bewirkt in C nur ein Schleifenkonstrukt eine Stringzerlegung für den PERL/PHP-Befehl split. Etwa sowas:

          char** split(char* text, char* search) {
            int anz=0;
            char* pos=text;
            while( (pos=strpos(text,search,pos) != NULL)
              anz++;
            char **erg = new char[anz]*;
            pos = text;
            char * pos_old=text;
            for int ( i=0; i<anz ; i++) {
              pos_old = pos;
              pos = strpos (text,search,pos);
              strncpy(erg[i], pos_old, pos-pos_old);
            }
            return erg;
          }

          So, jetzt mal voll aus dem Stehgreif ohne Syntax- oder Funktionstest und daher ohne Gewähr: Das währe ein Quellcode, mit dem man in C die Funktionsweise von split nachbilden kann. Dabei geht natürlich noch lange nicht dieser Aufruf:

          list($var1, $var2) = split($text,$search);

          Das wäre dann nochmal 'ne Wissenschaft für sich.

          Das hab ich ja noch nie gesehen! Ich dachte in MySQL geht immer nur eine Abfrage??? Was ist das?
          Grüße
          Andreas

          Grüße auch von
          Andreas

        2. Hi,

          SELECT DISTINCTROW [alte_tabelle].* INTO [neue_tabelle]
          FROM [alte_tabelle];
          Das hab ich ja noch nie gesehen!

          Da kannste mal sehen, was so alles in diesen Handbüchern drin steht.

          Ich dachte in MySQL geht immer nur eine Abfrage???

          Das ist ja auch nur eine Abfrage (nicht zwei Abfragen ;-).

          Was ist das?

          Eine alternative Schreibweise für
          INSERT INTO [neue_tabelle]
               SELECT DISTINCTROW [alte_tabelle].* FROM [alte_tabelle];

          Wenn Du es so herum notierst, dann siehst Du, daß das eigentliche
          Statement ein INSERT ist und kein SELECT.
          Aber die Menge der Datensätze, die eingefügt werden soll, kann selbst
          durchaus das Ergebnis einer Abfrage sein.
           (http://www.mysql.com/doc/I/N/INSERT_SELECT.html)
          Diese Art des "Subselect" kann mySQL.

          Ein Subselect in eine WHERE-Bedingung eines weiteren SELECT einspeisen
          (SELECT * from x WHERE x.feld IN (SELECT ...) kann mySQL nicht.

          Viele Grüße
                Michael