[mySQL] 2 Tabellen JOINen

Maschinist

Cadet 2nd Year
Registriert
Okt. 2002
Beiträge
17
Hallo,

mir fehlt ein wenig das Verständnis für die Lösung folgenden mySQL-Problems:
Ich will 2 Tabellen "joinen" und das Ergebnis in ein Textfile exportieren, wobei Tabelle 2 im Prinzip eine Teilmenge von Tabelle 1 darstellt.

Genauer (verkürzt):
- Tabelle 1 enthält Spalten "id", "interpret", "titel"
- Tabelle 2 enthält Spalten "nr","id", "nr_subtitel", "subtitel" (wobei "id" der Fremdschlüssel ist / "nr" hat keine Bedeutung, da nur interne SQL-Zähler)

Ich verknüpfe derzeit erfolglos wie folgt:
Code:
		...

		// $file: Textdatei, wo alles rein soll		
		// $id: eindeutige Nummer = Fremdschlüssel = Entität (Tab1:Tab2 = 1:N) 
		$sql = "SELECT ";
		$sql.= "tab1.interpret AS interpret,";
		$sql.= "tab1.titel AS titel, ";
		$sql.= "tab2.nr_subtititel AS nr_subtitel,";
		$sql.= "tab2.subtitel AS subtitel ";	
		$sql.= "INTO OUTFILE '$file' FIELDS TERMINATED BY '\n' ";
		$sql.= "FROM tab1 ";
		$sql.= "JOIN tab2 USING (id) ";
		$sql.= "WHERE tab1.id = '$id'";
		
		// export(): Funktion, die alles weitere erledigt...
		$arr = export ($sql);
		
		...

Das Ergebnis ist eine Textdatei, die mehr Daten als notwendig enthält;
nämlich für jeden "Subtitel" die Einträge aus Tabelle1 zur enstprechenden ID.

Mit anderen Worten: für 'n' Subtitel werden 'n' Spalten angelegt, wobei jede zusätzlich "interpret" und "titel" enthält. (Nötig wäre dies jedoch nur einmal zu Beginn, dann sollen die 'n' Subtitel gelistet werden.)

Das Problem liegt wohl eindeutig an Verwendung von "Join". habe diverse Varianten probiert -> jeweils gleiches Problem.

Vielleicht ist jemand so nett und weist mich auf den Verknüpfungsfehler hin.
Gerne erläutere ich auch ausführlicher, falls zu kompliziert.

Danke erstmal.

Der Maschinist
 
mh..versteh ich nicht ganz, aber viellleicht hilft dir das :
$query = mysql_query("SELECT t1.*,t2.* FROM tag1 AS t1 LEFT JOIN tab2 AS t2 ON t1.id=t2.id GROUP BY t1.id ORDER BY t1.id");
 
Kein Erfolg

... danke erstmal für die Antwort, leider funktioniert das auch nicht wie gewünscht.
Habe wieder etliche Kombinationen probiert (ohne zusätzliche WHERE-Bedingung geht zudem der Apache in die Knie... die muss wohl rein.)

Die Ergebnis-Tabelle enthält jetzt nur noch eine Zeile mit allem aus Tabelle 1 (soweit ok) und nur (!) dem ersten gefunden Eintrag aus Tabelle 2. Den Rest, läßt er gekonnt unter den Tisch fallen.

Schade.

Der Maschinist
 
Geht wohl gar nicht!

ich habe mir mein Vorhaben nochmals durchdacht. Ich glaube, das geht gar nicht!

Mit SELECT baut man sich ja wohl immer eine (zweidimensionale) Ergebnistabelle; was ich im Prinzip vorhatte war eine solche Tabelle1, von der eine (!) Zelle widerum eine komplette (zweidimensionale) Tabelle2 enthalten sollte.

D.h. jede Zeile aus Tabelle1 und jede Zeile aus Tabelle2 existierte in der Ergebnistabelle tatsächlich nur ein einziges Mal. Bei mir jedoch existiert jede Zeile aus Tabelle2 einmal und jede Zeile aus Tabelle1 n-Mal; eben so häufig, wie Tabelle2 Zeilen hat...

Die ganzen JOIN-Varianten können aber nur jede einzelne Zeile aus Tabelle2 eindeutig und vollständig mit Tabelle1 verknüpfen. Das Ergebnis ist immer eine einfache, zweidimensionale Tabelle mit Spalten und Zeilen, in der zu jeder Zeile aus Tabelle2 immer der ganze Verknüpfungswust aus Tabelle1 mitgeschleppt werden muß,

oder irre ich mich da?

Der Maschinist
 
Korrekt, ich wüsste auch nicht, wie man ein Feld durch eine ganze Reihe anderer Felder ersetzen sollte. Einziger Ausweg ist dabei, für jede Zeile, die du ausliest, eine weitere Query abzusetzen, die dir dann die Daten aus der zweiten Tabelle liefert oder aber folgendes:

Vor der Durchführung der "eigentlichen" Query eine Query absetzen, die dir alle Daten aus der zweiten Tabelle holt, sodass du diese Zwischenspeichern kannst. Dann bräuchtest du nur zwei Queries. Die Frage ist jedoch, wie gut du die Zusatzquery einschränken kannst, sodass diese dich nicht teurer kommt als eine zusätzliche Query pro Zeile.
 
Tachchen,

vielleicht solltest du es ganz anders machen - ohne JOIN...
Einfach mit eine FOR Schleife die erste Tabelle abgrasen und bei jeder Zeile die zugehoerigen Eintraege aus Tabelle 2 ausgeben...
Also so in etwa (pseudocode)

For (alle Tupel in Tabelle 1 - also Tabelle1_ID ) do
SELECT *
FROM Tabelle2
WHERE Tabelle2_ID == Tabelle1_ID
END FOR

Deine Version mit dem Join wird immer Redundanzen hervorrufen...

Toengel@Alex
 
Jawoll,

ich Danke Euch, genauso mach ich's jetzt (mit 2 getrennten Anfragen und anschliessend daraus zusammengebastelter Datei).

Funktioniert auch, habe nur leider nichts mehr von der "INTO $file"-Geschichte. Ich dachte, damit kann man sich 'ne Menge Arbeit sparen. Nun ja...

-erledigt-
Der Maschinist
 
Zurück
Oben