Doppelte Datensätze in MySQL
Achim Schrepfer
- datenbank
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
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
Hi,
SELECT DISTINCTROW [alte_tabelle].* INTO [neue_tabelle]
FROM [alte_tabelle];
danke, das war es was ich brauchte.
Viele Grüsse,
Achim
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
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
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