[C] Vergleich zweier SQL-Tabellen

Buba235

Erfahrenes Mitglied
Hallo!

Ich möchte den Inhalt von 2 Tabellen vergleichen. Um genau zu sein zwei Spalten in 2 verschiedenen Tabellen. Die eine Tabelle enthält nur 23 ver. Namen und eben auch 23 ver. IP-Adressen. In der zweiten Tabelle bei einer bestimmten Spalte befinden sich nur IP-Adressen, die auch mehrfach aber nicht geordnet vorkommen können. Jetzt möchte ich den Inhalt der Spalte der zweiten Tabelle mit dem Inhalt der ersten Tabelle vergleichen. Immer wenn eine IP-Adresse übereinstimmt, soll in die zweite Tabelle der Name zu der zugehörigen IP-Adresse eingetragen werden. Also mal ein Beispiel:
Erste Tabelle:
IP-----------------Name
123.456.789------Hans
234.567.890------Bert
345.678.901------Ernie

Zweite Tabelle:
IP-----------------Name
123.456.789------(leer) (<- Hier sollte jetzt Hans eingetragen werden)
100.001.000------(leer) (<- Hier ein anderer Name)
123.456.789------(leer) (<- Hier wieder Hans)
234.567.890------(leer) (<- Hier sollte Bert eingetragen werden)

Wie mach ich das denn jetzt? Ich hab mir die erste Tabelle mal in eine CSV-Datei geschrieben und mir nur die IP-Adressen ausgeben lassen. Funktioniert auch! Das hab ich so gemacht:

Code:
while(fgets(buffer, LINE_SIZE, datei) != NULL) {
                word = mystrtok(buffer, gelesene_Kommas);
                for(i = 0; word != NULL; i++) {
                        if (i == 1) {
                                printf("%s \n", word);
                                break;
                        }
                        word = mystrtok(NULL, gelesene_Kommas);
                }
        }

Aber wie kann ich das jetzt vergleichen? Und wie kann ich bei Übereinstimmung dann auch noch den dazugehörigen Namen in die zweite Tabelle eintragen? Könnt ihr mir da helfen? Ich hoffe mal es ist nicht zu verwirrend!
 
Ich hätte da folgenden Vorschlag:
C++:
// Mit einem SQL-Befehl die Datensätze aus Tabelle1 herausholen,
// deren IPs in Tabelle2 vorhanden sind
char sql_find[] = "SELECT IP,Name FROM Tabelle1 INNER JOIN Tabelle2 ON Tabelle1.IP = Tabelle2.IP";
// ...

// Eine Schleife über alle Ergebnisdatensätze laufen lassen
// und Tabelle2 aktualisieren
for( ... )
{
    char sql_update[] = "UPDATE Tabelle2 SET Name = \"Name_aus_aktuellem Ergebnisdatensatz\" WHERE IP = \"IP_aus_aus_aktuellem Ergebnisdatensatz\"";
    // ...
}
Vielleicht läßt sich das sogar mit einen einzigen SQL-Statement erschlagen, aber so fit bin ich dann darin doch nicht :)

Gruß
MCoder
 
Hi.

Wozu willst du denn die ganzen Daten doppelt und dreifach speichern? Du kannst doch bei einer Anfrage die entsprechende Spalte mit in das Resultat übernehmen. Oder du könntest eine VIEW erstellen (ab MySQL 5.0), das ist im Prinzip sowas wie eine Tabelle, nur das die Daten direkt aus anderen Tabellen stammen und keine Daten dupliziert werden.

Wenn du's trotzdem machen willst, kannst du das mit der SQL Anweisung:
SQL:
UPDATE tab1,tab2 SET tab2.name = tab1.name WHERE tab1.ip = tab2.ip;
Allerdings funktioniert das erstmal nur in MySQL - wenn du später auf eine andere Datenbank schwenken willst oder generell SQL 92 konform arbeiten willst solltest du es anders machen.

Gruß
 
Alternativ dazu und evtl etwas mehr dem Standard entsprechend sollte auch das gehen:

SQL:
update tabelle2 set Name = (select Name from tabelle1 where tabelle2.IP = IP);

Gruß,

RedWing
 
Hallo!

Meintest du das so:

Code:
      sql_find = "SELECT IP,NAME FROM ip_data \
INNER JOIN test ON ip_data.IP = test.SRC_IP";

        /*Ergebnis verarbeiten*/
        result = mysql_store_result(conn);
        if(result == NULL) {
                if(mysql_error(conn)) {
                        fprintf(stderr, "%s\n", mysql_error(conn));
                } else {
                        fprintf(stderr, "%s\n", "unknown error\n");
                }
        }

        /*Schleife ueber alle Datensaetze*/
        while((row = mysql_fetch_row(result)) != NULL) {
                for(i = 0; i < mysql_num_fields(result); i++) {
                        if(row[i] == NULL) {
                                /*printf("[NULL]\t");*/
                        } else {
                                if (i == (mysql_num_fields(result) - 1)) {
                                        sql_update = "UPDATE test SET \
NAME = row WHERE IP = row";
                                }
                        }
                }
        }

Also so in der Art meine ich. Weil so gehts nicht! Zumindest nimmt er die SQL-Befehle so nicht an!
 
Zurück