Vinzenz Mai: MySQL-Daten aus 3 Tabellen zusammenfügen

Beitrag lesen

Hallo

Hallo! Hätte da mal eine Frage.

ich habe zwar ein paar Antwortvorschläge, aber mehr als eine Frage an Dich.
Zuerst: Welche MySQL-Version verwendest Du?

Bei MySQL ist es immer ratsam, die verwendete Version mit anzugeben, da sich die Fähigkeiten von Version zu version sehr stark unterscheiden können. Eine neuere Version kann z.B. einen ganz anderen Lösungsvorschlag bedeuten.

Ich habe in einer Datenbank 3 Tabellen. Eine ist sozusagen die "Haupttabelle" und die beiden anderen sind eigentlich deshalb da weil die Daten aus einer veralteten Datenbank nicht anders zu exportieren sind.

Wie werden diese Daten exportiert?

Nun soll die "Haupttabelle" jeweils mit den Informationen der beiden anderen einmalig abgleichen.

Ist dies überhaupt nötig? Je nach verwendeter MySQL-Version könntest Du eventuell auf diesen Vorgang verzichten - und das ohne an Funktionalität zu verlieren.

Dieser Vorgang dauert sehr lange (ca. 5min.). Kann es sein, daß das ganze von mir aufgrund meiner Unwissenheit blöd gemacht ist

Wahrscheinlich.

und man das um einiges beschleunigen könnte?

Wahrscheinlich kann man das enorm vereinfachen und damit beschleunigen.

Code:

Trauriger Code, kein einziger Kommentar, nur ein rudimentärer Ansatz einer Fehlerbehandlung. Ich muss also raten, welche Voraussetzungen gelten, ich muss also raten, was Du vorhast. Ich versuche, so gezielt wie möglich zu raten.

$sql = " SELECT  F1, F2, F5, F6, F9, F11, F21, F12 FROM Tabelle1";

$res = mysql_query($sql);
$anz = mysql_num_rows($res);

Wie Kalle bereits angemerkt hat, verwendest Du diese Daten überhaupt nicht. Sie können an dieser Stelle weggelassen werden, damit wird Dein Skript bereits etwas schneller

$sql2 = $sql." ORDER BY F1 ASC";
$res2 = mysql_query($sql2);
$anz2 = mysql_num_rows($res2);

Wie ich bereits an anderer Stelle anmerkte, sind das schlecht gewählte Variablennamen. Hier gehe ich noch einen Schritt weiter. Deine Feldnamen sind eine einzige Katastrophe. Solche Namen gehören in Coderichtlinien verboten :-)

Weiterhin fragst Du die Spalten F9, F11, F12 und F21 ab, ohne diese Daten je zu nutzen. Grundsätzlich solltest Du keine Daten abrufen, die Du ungenutzt wegwirfst. Es beschleunigt das ganze auch ein wenig.

Nun zu Deiner while-Schleife. Ich versuche herauszufinden, was Du vorhast.

while ($row = mysql_fetch_array($res2, MYSQL_ASSOC)) {

$ht = mysql_fetch_array(mysql_query('SELECT F1, F2 FROM ht WHERE F1 = '.$row[F5].''));

Zu jeder Zeile der Tabelle "Tabelle1" (noch ein ungünstig gewählter Name) suchst Du _genau einen_ einen passenden Eintrag in der Tabelle ht (nicht viel besser). Du gehst davon aus, dass ein solcher Eintrag existiert, Du interessierst Dich nur für den ersten Eintrag. Ich folgere daraus, dass es genau einen passenden Eintrag dazu gibt. Dabei korrespondiert der Wert in der Spalte F1 der Tabelle ht mit dem Wert der Spalte F5 in Tabelle1.

$ut = mysql_fetch_array(mysql_query('SELECT F1, F2 FROM ut WHERE F1 = '.$row[F6].''));

Hier gehst Du analog vor: ut.F1 entspricht Tabelle1.F6

Wie Jörg bereits angemerkt hat, solltest Du dazu mit Joins arbeiten und nicht mit einer While-Schleife. Ich liefere Dir dazu Links zu den JOIN-Artikeln:

Einführung JOINS
Fortgeschrittenene Joins

echo $ht[F2]." ".$row[F2]." ".$ut[F2]."<br>";
mysql_query('UPDATE Tabelle1 SET F28 = "'.$ht[F2].'" WHERE CONCAT( F1 ) = '.$row[F1].'');

Deine WHERE-Klausel kommt mir reichlich sinnfrei vor: Welchen Vorzug hat sie gegenüber einem einfachen WHERE F1 = '[code lang=php] . $row['F1'] . '[/code]. Einen PHP-Fehler habe ich dabei schon korrigiert :-)

mysql_query('UPDATE Tabelle1 SET F29 = "'.$ut[F2].'" WHERE CONCAT( F1 ) = '.$row[F1].'');
}

Grundsätzlich ist der ganze PHP-Kram völlig überflüssig, wenn meine Annahmen stimmen. Dann reicht Dir folgendes einfache SQL-Statement, siehe auch MySQL-Handbuch, UPDATE-Syntax:

UPDATE Tabelle1 t               -- Aliasname, um Schreibarbeit zu sparen :-)  
INNER JOIN ht ON t.F5 = ht.F1   -- Qualifizierte Spaltennamen, wenn mehrfach  
INNER JOIN ut ON t.F6 = ut.F1  
SET  
    t.F28 = ht.F2,              -- Update von F28 mit Wert aus Tabelle ht  
    t.F29 = ut.F2               -- Update von F29 aus Wert aus Tabelle ut  

Schicke dieses Statement mit dem MySQL-Client Deiner Wahl, von mir aus auch PHP an den entsprechenden MySQL-Server mit vorheriger Auswahl der gewünschten Datenbank und Du solltest Dein Ziel erreichen.

Als Alternative käme, MySQL 5.x vorausgesetzt, der Einsatz von Views in Frage, so dass das Aktualisieren der Tabelle entfallen könnte.

Bitte nimm den Hinweis von Mike ernst. Ich habe überlegt, wo ich Dir antworte und mich für diesen Thread hier entschieden, weil von hier aus auch Dein Ausgangsthread erreichbar ist und andererseits Dir schon zwei Vorschläge gemacht wurden. Grundsätzlich zielte der Beitrag von H.P. Ortner in die richtige Richtung, es fehlten die JOINS und die Idee, alles in einem Aufwasch zu erledigen.

Wenn mein Vorschlag Dein Problem nicht lösen sollte, so liegt dies an Deinem Ausgangsposting, das zu viele Fragen offenläßt und die Situation nicht genau genug beschreibt. Bei solchen Fragen wie Deiner ist es immer eine gute Idee, ein paar Beispieldatensätze mit anzugeben und aufzuzeigen, wie das Ergebnis aussehen soll - und warum.

Freundliche Grüße

Vinzenz