zwei tabellen abgleichen

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Antworten
Benutzeravatar
mondi
Mitglied
Beiträge: 187
Registriert: 22.02.2003 10:14
Wohnort: Bremerhaven
Kontaktdaten:

zwei tabellen abgleichen

Beitrag von mondi »

Hallo (und frohes Neues)
mal eine Frage. Gibt es einen mysql aufruf um zwei Tabellen (sagen wir games und history) miteinander zu vergleichen mit dem Ziel, diejenigen Einträge in der Tabelle history zu finden, für die kein Eintrag mehr in der Tabelle games existiert. Gemeinsamer Nenner ist die gameID
Würde mir sehr helfen!
Grüße
Sir Mondi
Zuletzt geändert von mondi am 05.01.2004 16:42, insgesamt 1-mal geändert.
..:: VERDI FOREVER ::..
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Beitrag von Pyramide »

Code: Alles auswählen

SELECT h.gameID
FROM history h LEFT JOIN games g ON (h.gameID = g.gameID)
WHERE g.gameID IS NULL
Sollte funktionieren
Benutzeravatar
mondi
Mitglied
Beiträge: 187
Registriert: 22.02.2003 10:14
Wohnort: Bremerhaven
Kontaktdaten:

Beitrag von mondi »

In der Tat. Funktioniert ausgezeichnet.
Mache ich aus SELECT aber nun DELETE, weil ich den ganzen Kram ja loswerden will, kommt MYSQL mit folgender Fehlermeldung:

Code: Alles auswählen

#1064 - You have an error in your SQL syntax near 'h.gameID FROM history h LEFT  JOIN games g ON ( h.gameID = g.gameID )  WHERE g.g' at line 1 
Auch dafür noch einen Tipp?
Verbindlichsten Dank!

Grüße
Mondi
..:: VERDI FOREVER ::..
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Beitrag von Pyramide »

SELECT und DELETE sind auch zwei verschiedene Befehle. Theoretisch könnte man schreiben:

Code: Alles auswählen

DELETE FROM history
WHERE NOT EXISTS(SELECT * FROM games WHERE games.gameID = history.gameID)
Aber da MySQL subqueries erst in 4.1 unterstützt, musst du dir warscheinlich mit der o.a. SELECT-Anfrage, [php:implode] und WHERE gameID IN(1,2,3) eine eigene Lösung bauen.
Benutzeravatar
mondi
Mitglied
Beiträge: 187
Registriert: 22.02.2003 10:14
Wohnort: Bremerhaven
Kontaktdaten:

Beitrag von mondi »

mhhh ... ich glaube, dann lösche ich die doch lieber per Hand. Sind ja nur 344 Datensätze :(

Trotzdem vielen Dank! Hat mir sehr geholfen.
..:: VERDI FOREVER ::..
Benutzeravatar
mondi
Mitglied
Beiträge: 187
Registriert: 22.02.2003 10:14
Wohnort: Bremerhaven
Kontaktdaten:

Beitrag von mondi »

Pyramide hat geschrieben: ... musst du dir warscheinlich mit der o.a. SELECT-Anfrage, <a href="http://de.php.net/manual-lookup.php?lan ... on=implode" target="_blank" class="postlink">implode</a> und WHERE gameID IN(1,2,3) eine eigene Lösung bauen.
Hallo!
Da das Problem mittlerweile doch dringlicher geworden ist, würde ich gerne nochmal nachfragen, wie man sich so eine Lösung basteln könnte (oder ob Sie mir jemand basteln könnte; denn ich fürchte, ich bekomme das nicht hin).
Verbindlichen Dank!

Grüße
Mondi
..:: VERDI FOREVER ::..
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Beitrag von Pyramide »

Code: Alles auswählen

$r = mysql_query('SELECT h.gameID 
FROM history h LEFT JOIN games g ON (h.gameID = g.gameID) 
WHERE g.gameID IS NULL');
$games = array();
while($row = mysql_fetch_array($r)) {
    $games[] = $row['gameID'];
}

mysql_query('DELETE FROM history WHERE gameID IN(' . implode(', $games) . ')');
(ungetestet)
Benutzeravatar
mondi
Mitglied
Beiträge: 187
Registriert: 22.02.2003 10:14
Wohnort: Bremerhaven
Kontaktdaten:

Beitrag von mondi »

Danke! Jetzt braucht es wahrscheinlich Geduld mit mir! Frage: Ich speichere das ganze jetzt als eine Datei delete.php auf dem Server und rufe die mit einem browser auf. Macht aber noch keinen Effekt, denn nach wie vor sind die einträge in History, die in games keine gameID mehr haben und damit eigentlich weg sein sollten.

So sieht die delete.php jetzt aus:

Code: Alles auswählen


<?
        require 'config.php';
        require 'connectdb.php';

    $r = mysql_query('SELECT h.gameID FROM history h LEFT JOIN games g ON (h.gameID = g.gameID) WHERE g.gameID IS NULL'); 
$games = array(); 
while($row = mysql_fetch_array($r)) { 
    $games[] = $row['gameID']; 
} 

mysql_query('DELETE FROM history WHERE gameID IN(' . implode(', $games) . ')');



?>
Oder muss ich das ganz anders machen?

Grüße
Mondi
..:: VERDI FOREVER ::..
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Beitrag von Pyramide »

Guck doch mal, wo der Fehler liegt, z.B. mit [php:mysql_error] oder ob die Anfrage keine Ergebnisse zurückgibt.
Antworten

Zurück zu „Coding & Technik“