Seite 1 von 1

zwei tabellen abgleichen

Verfasst: 05.01.2004 11:37
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

Verfasst: 05.01.2004 16:13
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

Verfasst: 05.01.2004 16:39
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

Verfasst: 05.01.2004 16:49
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.

Verfasst: 05.01.2004 16:56
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.

Verfasst: 13.03.2004 19:20
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

Verfasst: 13.03.2004 20:03
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)

Verfasst: 13.03.2004 20:31
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

Verfasst: 14.03.2004 13:46
von Pyramide
Guck doch mal, wo der Fehler liegt, z.B. mit [php:mysql_error] oder ob die Anfrage keine Ergebnisse zurückgibt.